利用poi操作excel,拷贝行列,在拷贝完列的宽度之后,会发生部分列,被隐藏起来显示。请高手指点一下如何解决这个问题。

解决方案 »

  1.   

    for (int i = baseSheet.getFirstRowNum(); i <= baseSheet.getLastRowNum(); i++) {
        HSSFRow baseRow = baseSheet.getRow(i);
        if (baseRow != null) {
          for (short j = baseRow.getFirstCellNum(); j < baseRow.getLastCellNum(); j++) {
             targetSheet.setColumnWidth(j, baseSheet.getColumnWidth(j));
          }
        break;
       }
    }
      

  2.   

    我估计是拷贝行列的时候,有的宽度没有设置。因为哪个cell单元格是空的,给跳过去了。
    poi里面有没有直接设置行列隐藏的方法啊
      

  3.   

    /**
     * 拷贝sheet
     * @param wb
     * @param baseSheetNum
     *            源sheet
     * @param targetSheetNum
     *            目标sheet
     */
    public void copySheet(HSSFWorkbook wb, int baseSheetNum) {
    if (wb != null && wb.getSheetAt(baseSheetNum) != null) {
    HSSFSheet baseSheet = wb.getSheetAt(baseSheetNum);
    HSSFSheet targetSheet = wb.createSheet(wb
    .getSheetName(baseSheetNum)
    + "-1");
    // 拷贝所有的行
    for (int i = baseSheet.getFirstRowNum(); i <= baseSheet
    .getLastRowNum(); i++) {
    HSSFRow baseRow = baseSheet.getRow(i);
    HSSFRow targetRow = targetSheet.createRow(i);
    if (baseRow == null) {
    continue;
    }
    // 行高
    targetRow.setHeight(baseRow.getHeight());
    for (Short j = baseRow.getFirstCellNum(); j <= baseRow
    .getLastCellNum(); j++) {
    HSSFCell baseCell = baseRow.getCell(j);
    HSSFCell targetCell = targetRow.createCell(j);
    if (baseCell == null) {
    continue;
    }
    targetCell.setEncoding(baseCell.getEncoding());
    targetCell.setCellStyle(baseCell.getCellStyle());
    targetCell.setCellType(baseCell.getCellType());
    int cellType = baseCell.getCellType();
    switch (cellType) {
    case HSSFCell.CELL_TYPE_BOOLEAN:
    targetCell.setCellValue(baseCell.getBooleanCellValue());
    break;
    case HSSFCell.CELL_TYPE_ERROR:
    targetCell.setCellErrorValue(baseCell
    .getErrorCellValue());
    break;
    case HSSFCell.CELL_TYPE_FORMULA:
    // parseFormula这个函数的用途在后面说明
    targetCell.setCellFormula(parseFormula(baseCell
    .getCellFormula()));
    break;
    case HSSFCell.CELL_TYPE_NUMERIC:
    targetCell.setCellValue(baseCell.getNumericCellValue());
    break;
    case HSSFCell.CELL_TYPE_STRING:
    targetCell.setCellValue(baseCell.getStringCellValue());
    break;
    }
    }
    }
    // 拷贝合并的行
    for (int i = 0; i < baseSheet.getNumMergedRegions(); i++) {
    Region region = baseSheet.getMergedRegionAt(i);
    targetSheet.addMergedRegion(region);
    }
    // 设置列宽
    for (int i = baseSheet.getFirstRowNum(); i <= baseSheet
    .getLastRowNum(); i++) {
    HSSFRow baseRow = baseSheet.getRow(i);
    if (baseRow != null) {
    for (short j = baseRow.getFirstCellNum(); j < baseRow
    .getLastCellNum(); j++) {
    targetSheet.setColumnWidth(j, baseSheet
    .getColumnWidth(j));
    }
    break;
    }
    }
    }
    }
      

  4.   

    /**
     * 拷贝sheet
     * @param wb
     * @param baseSheetNum
     *            源sheet
     * @param targetSheetNum
     *            目标sheet
     */
    public void copySheet(HSSFWorkbook wb, int baseSheetNum) {
          if (wb != null && wb.getSheetAt(baseSheetNum) != null) {
    HSSFSheet baseSheet = wb.getSheetAt(baseSheetNum);
    HSSFSheet targetSheet = 
                           wb.createSheet(wb.getSheetName(baseSheetNum)+ "-1");
    // 拷贝所有的行
    for (int i = baseSheet.getFirstRowNum(); i <= baseSheet
    .getLastRowNum(); i++) {
         HSSFRow baseRow = baseSheet.getRow(i);
         HSSFRow targetRow = targetSheet.createRow(i);
         if (baseRow == null) {
    continue;
         }
         // 行高
         targetRow.setHeight(baseRow.getHeight());
         for (Short j = baseRow.getFirstCellNum(); j <= baseRow
    .getLastCellNum(); j++) {
    HSSFCell baseCell = baseRow.getCell(j);
    HSSFCell targetCell = targetRow.createCell(j);
    if (baseCell == null) {
         continue;
    }
    targetCell.setEncoding(baseCell.getEncoding());
    targetCell.setCellStyle(baseCell.getCellStyle());
    targetCell.setCellType(baseCell.getCellType());
    int cellType = baseCell.getCellType();
    switch (cellType) {
          case HSSFCell.CELL_TYPE_BOOLEAN:
          break;
          case HSSFCell.CELL_TYPE_ERROR:
          break;
          case HSSFCell.CELL_TYPE_FORMULA:
                      break;
          case HSSFCell.CELL_TYPE_NUMERIC:
          break;
          case HSSFCell.CELL_TYPE_STRING:
               targetCell.setCellValue(baseCell.getStringCellValue());
          break;
         }
    }
         }
         // 拷贝合并的行
         for (int i = 0; i < baseSheet.getNumMergedRegions(); i++) {
    Region region = baseSheet.getMergedRegionAt(i);
    targetSheet.addMergedRegion(region);
         }
        // 设置列宽
        for (int i = baseSheet.getFirstRowNum(); i <= baseSheet
    .getLastRowNum(); i++) {
    HSSFRow baseRow = baseSheet.getRow(i);
    if (baseRow != null) {
        for (short j = baseRow.getFirstCellNum(); j < baseRow
    .getLastCellNum(); j++) {
          targetSheet.setColumnWidth(j, baseSheet.getColumnWidth(j));
        }
        break;
    }
    }
    }
    }
      

  5.   

    偶不知道你具体的应用
    但私下认为象这样拷贝不太好,反正都是sheet完全拷贝,建议用文件拷贝的方式,然后指定sheet保留,不拷贝的sheet删除掉
      

  6.   

    但是我的需求是这样的:根据一个sheet模板,生成多个sheet并且在每个sheet里面填充数据!
    另外你说的sheet完全拷贝怎么拷贝啊?poi有提供这个方法了?能不能把代码传一下?
      

  7.   

    FileInputStream fileIn;
    FileOutputStream fileOut;
    POIFSFileSystem fs;
    fileIn = new FileInputStream(".\\rptTemplate\\rptTemplate1.xls");//读取模板
    fs = new POIFSFileSystem(fileIn);
                wb = new HSSFWorkbook(fs);
                sheet = wb.getSheetAt(0);
    //....得到了sheet模板,开始写数据,下边是输出
    fileOut = new FileOutputStream(destfile);
                wb.write(fileOut);
                fileOut.close();
      

  8.   

    呵呵,你误会了我是根据一个workbook里面的一个sheet去生成这个workbool里面的多个sheet。就像这样:第一个sheet是关于员工信息的一个模板,然后我把所有员工的信息都显示在这个excel里面,每个员工对应一个sheet!!!!
      

  9.   

    晕,你自己选择一下得到哪个sheet模板啊,然后多生成几个不是就可以了,偶只是做个示例,你还想我完全给你写完??兄弟,你再仔细看看吧,这个代码扩展一下完全可以满足你