java实现合并单元格的同时并导出excel示例
程序员文章站
2024-03-04 23:59:42
介绍
poi提供api给java程序对microsoft office格式档案读和写的功能。poi可以操作的文档格式有excel,word,powerpoint等,poi...
介绍
poi提供api给java程序对microsoft office格式档案读和写的功能。poi可以操作的文档格式有excel,word,powerpoint等,poi进行跨行需要用到对象hssfsheet对象,现在就当我们程序已经定义了一个hssfsheet对象sheet。
跨第1行第1个到第2个单元格的操作为
sheet.addmergedregion(new region(0,(short)0,0,(short)1));
跨第1行第1个到第2行第1个单元格的操作为
sheet.addmergedregion(new region(0,(short)0,1,(short)0));
重点注意事项:
1.单元格cell和row对象下标都是从0开始的。
2.单元格合并时region(1,2,3,4)第1个值的行号必须要比3位置的行号小,如果大于3就不能正常合并单元格
3.合并单元格的时候要合并的单单元格必须先创建,这样方便后面再次获取这个单元格来填充数据,主要就是因为合并时不能由后向前进行合并引起的。
示例代码
import java.io.ioexception; import org.apache.poi.hssf.usermodel.hssfcell; import org.apache.poi.hssf.usermodel.hssfcellstyle; import org.apache.poi.hssf.usermodel.hssfrow; import org.apache.poi.hssf.usermodel.hssfsheet; import org.apache.poi.hssf.usermodel.hssfworkbook; import org.apache.poi.hssf.util.region; public class exceltest { /** * @param args */ public static void main(string[] args) throws ioexception { try { hssfworkbook wb = new hssfworkbook(); hssfsheet sheet = wb.createsheet("new sheet"); hssfcellstyle style = wb.createcellstyle(); // 样式对象 style.setverticalalignment(hssfcellstyle.vertical_center);// 垂直 style.setalignment(hssfcellstyle.align_center);// 水平 hssfrow row = sheet.createrow((short) 0); hssfrow row2 = sheet.createrow((short) 1); sheet.addmergedregion(new region(0, (short) 0, 1, (short) 0)); hssfcell ce = row.createcell((short) 0); ce.setencoding(hssfcell.encoding_utf_16);// 中文处理 ce.setcellvalue("项目\\日期"); // 表格的第一行第一列显示的数据 ce.setcellstyle(style); // 样式,居中 int num = 0; for (int i = 0; i < 9; i++) { // 循环9次,每一次都要跨单元格显示 // 计算从那个单元格跨到那一格 int celln = 0; int celle = 0; if (i == 0) { celln = 0; celle = 1; } else { celln = (i * 2); celle = (i * 2 + 1); } // 单元格合并 // 四个参数分别是:起始行,起始列,结束行,结束列 sheet.addmergedregion(new region(0, (short) (celln + 1), 0, (short) (celle + 1))); hssfcell cell = row.createcell((short) (celln + 1)); cell.setcellvalue("merging" + i); // 跨单元格显示的数据 cell.setcellstyle(style); // 样式 // 不跨单元格显示的数据,如:分两行,上一行分别两格为一格,下一行就为两格,“数量”,“金额” hssfcell cell1 = row2.createcell((short) celle); hssfcell cell2 = 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(new region(0, (short) (2 * num + 1), 0, (short) (2 * num + 2))); hssfcell cell = row.createcell((short) (2 * num + 1)); cell.setencoding(hssfcell.encoding_utf_16); cell.setcellvalue("合计"); cell.setcellstyle(style); hssfcell cell1 = row2.createcell((short) (2 * num + 1)); hssfcell cell2 = 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(new region(0, (short) (2 * num + 3), 0, (short) (2 * num + 4))); hssfcell cellb = row.createcell((short) (2 * num + 3)); cellb.setencoding(hssfcell.encoding_utf_16); cellb.setcellvalue("百分比"); cellb.setcellstyle(style); hssfcell cellb1 = row2.createcell((short) (2 * num + 3)); hssfcell cellb2 = 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了。 fileoutputstream fileout = new fileoutputstream("workbook.xls"); wb.write(fileout); fileout.close(); **/ /**第二种是输出到也面中的excel名称 * pname="栏目统计表"; response.reset(); response.setcontenttype("application/x-msdownload"); response.setheader("content-disposition","attachment; filename="+new string(pname.getbytes("gb2312"),"iso-8859-1")+".xls"); servletoutputstream outstream=null; try{ outstream = response.getoutputstream(); wb.write(outstream); }catch(exception e) { e.printstacktrace(); }finally{ outstream.close(); } * */ system.out.print("ok"); } catch (exception ex) { ex.printstacktrace(); } } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。