Java POI Excel sheet合并

转自:http://zhuyufufu.iteye.com/blog/2033386

由于工作上的需要,特地研究了下Excel合并的问题,现贴出来,希望能帮到有需要的同行

参考资料
http://blog.sina.com.cn/s/blog_73d38dbc0100r2ob.html
http://blog.163.com/tangweibo_good/blog/static/7749240920114265535652/

上面这个163地址的程序实现了同一个Excel不同工作簿的拷贝。
在上面的基础上上,我实现了不同Excel工作簿的拷贝,重点在样式的拷贝。
由于种种原因,在cell的样式拷贝时需要重新创建style对象

Java代码
  1. //样式的设置
  2.                 HSSFCellStyle cStyle = destWorkBook.createCellStyle();
  3.                 cStyle.cloneStyleFrom(sourceCell.getCellStyle());
  4.                 targetCell.setCellStyle(cStyle);

调用示例

Java代码
  1. public static HSSFWorkbook mergeHSSFWorkbooks(HSSFWorkbook[] workbooks) {
  2.         if(workbooks == null || workbooks.length == 0){
  3.             return null;
  4.         }else if(workbooks.length == 1){
  5.             return workbooks[0];
  6.         }
  7.         HSSFWorkbook wbFirst = workbooks[0];
  8.         HSSFSheet toSheet = wbFirst.getSheetAt(0);
  9.         for (int i = 1; i < workbooks.length; i++) {
  10.             HSSFWorkbook wb = workbooks[i];
  11.             HSSFSheet fromsheet = wb.getSheetAt(0);
  12.             copyRows(wbFirst, wb, fromsheet, toSheet, fromsheet.getFirstRowNum(), fromsheet.getLastRowNum(), toSheet.getLastRowNum());
  13.         }
  14.         return wbFirst;
  15.     }

具体的拷贝代码

Java代码
  1. /**
  2.  * @param destWorkBook 目标workbook
  3.  * @param sourceWorkBook 源workbook
  4.  * @param sourceSheet 源sheet
  5.  * @param targetSheet 目sheet
  6.  * @param pStartRow 起始读取行
  7.  * @param pEndRow 结束读取行
  8.  * @param pPosition 目标保存
  9.  */
  10. public static void copyRows(HSSFWorkbook destWorkBook, HSSFWorkbook sourceWorkBook, HSSFSheet sourceSheet,HSSFSheet targetSheet, int pStartRow, int pEndRow, int pPosition) {
  11.     HSSFRow sourceRow = null;
  12.     HSSFRow targetRow = null;
  13.     HSSFCell sourceCell = null;
  14.     HSSFCell targetCell = null;
  15.     int cType;
  16.     int i;
  17.     int j;
  18.     int targetRowFrom;
  19.     int targetRowTo;
  20.     if ((pStartRow == -1) || (pEndRow == -1)) {
  21.         return;
  22.     }
  23.     List<CellRangeAddress> oldRanges = new ArrayList<CellRangeAddress>();
  24.     for (i = 0; i < sourceSheet.getNumMergedRegions(); i++) {
  25.         oldRanges.add(sourceSheet.getMergedRegion(i));
  26.     }
  27.     // 拷贝合并的单元格。原理:复制当前合并单元格后,原位置的格式会移动到新位置,需在原位置生成旧格式
  28.     for (int k = 0; k < oldRanges.size(); k++) {
  29.         CellRangeAddress oldRange = oldRanges.get(k);
  30.         CellRangeAddress newRange = new CellRangeAddress(oldRange
  31.                 .getFirstRow(), oldRange.getLastRow(), oldRange
  32.                 .getFirstColumn(), oldRange.getLastColumn());
  33.         if (oldRange.getFirstRow() >= pStartRow
  34.                 && oldRange.getLastRow() <= pEndRow) {
  35.             targetRowFrom = oldRange.getFirstRow() - pStartRow + pPosition;
  36.             targetRowTo = oldRange.getLastRow() - pStartRow + pPosition;
  37.             oldRange.setFirstRow(targetRowFrom);
  38.             oldRange.setLastRow(targetRowTo);
  39.             targetSheet.addMergedRegion(oldRange);
  40.             sourceSheet.addMergedRegion(newRange);
  41.         }
  42.     }
  43.     // 设置列宽
  44.     for (i = pStartRow; i <= pEndRow; i++) {
  45.         sourceRow = sourceSheet.getRow(i);
  46.         if (sourceRow != null) {
  47.             for (j = sourceRow.getLastCellNum(); j > sourceRow.getFirstCellNum(); j--) {
  48.                 targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j));
  49.                 targetSheet.setColumnHidden(j, false);
  50.             }
  51.             break;
  52.         }
  53.     }
  54.     // 拷贝行并填充数据
  55.     for (; i <= pEndRow; i++) {
  56.         sourceRow = sourceSheet.getRow(i);
  57.         if (sourceRow == null) {
  58.             continue;
  59.         }
  60.         targetRow = targetSheet.createRow(i - pStartRow + pPosition);
  61.         targetRow.setHeight(sourceRow.getHeight());
  62.         for (j = sourceRow.getFirstCellNum(); j <= sourceRow.getPhysicalNumberOfCells(); j++) {
  63.             sourceCell = sourceRow.getCell(j);
  64.             if (sourceCell == null) {
  65.                 continue;
  66.             }
  67.             targetCell = targetRow.createCell(j);
  68.             //样式的设置
  69.             HSSFCellStyle cStyle = destWorkBook.createCellStyle();
  70.             cStyle.cloneStyleFrom(sourceCell.getCellStyle());
  71.             targetCell.setCellStyle(cStyle);
  72.             cType = sourceCell.getCellType();
  73.             targetCell.setCellType(cType);
  74.             switch (cType) {
  75.             case HSSFCell.CELL_TYPE_BOOLEAN:
  76.                 targetCell.setCellValue(sourceCell.getBooleanCellValue());
  77.                 // System.out.println("--------TYPE_BOOLEAN:" + targetCell.getBooleanCellValue());
  78.                 break;
  79.             case HSSFCell.CELL_TYPE_ERROR:
  80.                 targetCell.setCellErrorValue(sourceCell.getErrorCellValue());
  81.                 // System.out.println("--------TYPE_ERROR:" + targetCell.getErrorCellValue());
  82.                 break;
  83.             case HSSFCell.CELL_TYPE_FORMULA:
  84.                 // parseFormula这个函数的用途在后面说明
  85.                 targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula()));
  86.                 // System.out.println("--------TYPE_FORMULA:" + targetCell.getCellFormula());
  87.                 break;
  88.             case HSSFCell.CELL_TYPE_NUMERIC:
  89.                 targetCell.setCellValue(sourceCell.getNumericCellValue());
  90.                 // System.out.println("--------TYPE_NUMERIC:" + targetCell.getNumericCellValue());
  91.                 break;
  92.             case HSSFCell.CELL_TYPE_STRING:
  93.                 targetCell.setCellValue(sourceCell.getRichStringCellValue());
  94.                 // System.out.println("--------TYPE_STRING:" + i + targetCell.getRichStringCellValue());
  95.                 break;
  96.             }
  97.         }
  98.     }
  99. }
  100. /**
  101.  * 处理公式
  102.  * @param pPOIFormula
  103.  * @return
  104.  */
  105. private static String parseFormula(String pPOIFormula) {
  106.     final String cstReplaceString = "ATTR(semiVolatile)"//$NON-NLS-1$
  107.     StringBuffer result = null;
  108.     int index;
  109.     result = new StringBuffer();
  110.     index = pPOIFormula.indexOf(cstReplaceString);
  111.     if (index >= 0) {
  112.         result.append(pPOIFormula.substring(0, index));
  113.         result.append(pPOIFormula.substring(index + cstReplaceString.length()));
  114.     } else {
  115.         result.append(pPOIFormula);
  116.     }
  117.     return result.toString();
  118. }
点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注