java实现合并单元格的同时并导出excel示例
介绍
POI提供API给Java程序对MicrosoftOffice格式档案读和写的功能。POI可以操作的文档格式有excel,word,powerpoint等,POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet。
跨第1行第1个到第2个单元格的操作为
sheet.addMergedRegion(newRegion(0,(short)0,0,(short)1));
跨第1行第1个到第2行第1个单元格的操作为
sheet.addMergedRegion(newRegion(0,(short)0,1,(short)0));
重点注意事项:
1.单元格CELL和ROW对象下标都是从0开始的。
2.单元格合并时Region(1,2,3,4)第1个值的行号必须要比3位置的行号小,如果大于3就不能正常合并单元格
3.合并单元格的时候要合并的单单元格必须先创建,这样方便后面再次获取这个单元格来填充数据,主要就是因为合并时不能由后向前进行合并引起的。
示例代码
importjava.io.IOException;
importorg.apache.poi.hssf.usermodel.HSSFCell;
importorg.apache.poi.hssf.usermodel.HSSFCellStyle;
importorg.apache.poi.hssf.usermodel.HSSFRow;
importorg.apache.poi.hssf.usermodel.HSSFSheet;
importorg.apache.poi.hssf.usermodel.HSSFWorkbook;
importorg.apache.poi.hssf.util.Region;
publicclassExcelTest{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args)throwsIOException{
try{
HSSFWorkbookwb=newHSSFWorkbook();
HSSFSheetsheet=wb.createSheet("newsheet");
HSSFCellStylestyle=wb.createCellStyle();//样式对象
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平
HSSFRowrow=sheet.createRow((short)0);
HSSFRowrow2=sheet.createRow((short)1);
sheet.addMergedRegion(newRegion(0,(short)0,1,(short)0));
HSSFCellce=row.createCell((short)0);
ce.setEncoding(HSSFCell.ENCODING_UTF_16);//中文处理
ce.setCellValue("项目\\日期");//表格的第一行第一列显示的数据
ce.setCellStyle(style);//样式,居中
intnum=0;
for(inti=0;i<9;i++){//循环9次,每一次都要跨单元格显示
//计算从那个单元格跨到那一格
intcelln=0;
intcelle=0;
if(i==0){
celln=0;
celle=1;
}else{
celln=(i*2);
celle=(i*2+1);
}
//单元格合并
//四个参数分别是:起始行,起始列,结束行,结束列
sheet.addMergedRegion(newRegion(0,(short)(celln+1),0,
(short)(celle+1)));
HSSFCellcell=row.createCell((short)(celln+1));
cell.setCellValue("merging"+i);//跨单元格显示的数据
cell.setCellStyle(style);//样式
//不跨单元格显示的数据,如:分两行,上一行分别两格为一格,下一行就为两格,“数量”,“金额”
HSSFCellcell1=row2.createCell((short)celle);
HSSFCellcell2=row2.createCell((short)(celle+1));
cell1.setEncoding(HSSFCell.ENCODING_UTF_16);
cell1.setCellValue("数量");
cell1.setCellStyle(style);
cell2.setEncoding(HSSFCell.ENCODING_UTF_16);
cell2.setCellValue("金额");
cell2.setCellStyle(style);
num++;
}
//在后面加上合计百分比
//合计在最后加上,还要跨一个单元格
sheet.addMergedRegion(newRegion(0,(short)(2*num+1),0,
(short)(2*num+2)));
HSSFCellcell=row.createCell((short)(2*num+1));
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue("合计");
cell.setCellStyle(style);
HSSFCellcell1=row2.createCell((short)(2*num+1));
HSSFCellcell2=row2.createCell((short)(2*num+2));
cell1.setEncoding(HSSFCell.ENCODING_UTF_16);
cell1.setCellValue("数量");
cell1.setCellStyle(style);
cell2.setEncoding(HSSFCell.ENCODING_UTF_16);
cell2.setCellValue("金额");
cell2.setCellStyle(style);
//百分比同上
sheet.addMergedRegion(newRegion(0,(short)(2*num+3),0,
(short)(2*num+4)));
HSSFCellcellb=row.createCell((short)(2*num+3));
cellb.setEncoding(HSSFCell.ENCODING_UTF_16);
cellb.setCellValue("百分比");
cellb.setCellStyle(style);
HSSFCellcellb1=row2.createCell((short)(2*num+3));
HSSFCellcellb2=row2.createCell((short)(2*num+4));
cellb1.setEncoding(HSSFCell.ENCODING_UTF_16);
cellb1.setCellValue("数量");
cellb1.setCellStyle(style);
cellb2.setEncoding(HSSFCell.ENCODING_UTF_16);
cellb2.setCellValue("金额");
cellb2.setCellStyle(style);
/***这里是问题的关键,将这个工作簿写入到一个流中就可以输出相应的名字,这里需要写路径就ok了。
FileOutputStreamfileOut=newFileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
**/
/**第二种是输出到也面中的excel名称
*pName="栏目统计表";
response.reset();
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition","attachment;filename="+newString(pName.getBytes("gb2312"),"ISO-8859-1")+".xls");
ServletOutputStreamoutStream=null;
try{
outStream=response.getOutputStream();
wb.write(outStream);
}catch(Exceptione)
{
e.printStackTrace();
}finally{
outStream.close();
}
**/
System.out.print("OK");
}catch(Exceptionex){
ex.printStackTrace();
}
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。