首页 > 开发 > Java > 正文

java实现合并单元格的同时并导出excel示例

2024-07-13 10:05:33
字体:
来源:转载
供稿:网友

介绍

POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI可以操作的文档格式有excelword,powerpoint等,POI进行跨行需要用到对象HSSFSheet对象,现在就当我们程序已经定义了一个HSSFSheet对象sheet。

跨第1行第1个到第2个单元格的操作为

java;">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();    }     }    } 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对VeVb武林网的支持。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表