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(); } } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。