从格式的excel文件中获取单元格值

时间:2013-12-30 21:16:53

标签: java excel apache-poi

我正在尝试将excel文件表中的所有内容附加到另一个Excel文件表中。一切都很好,除了单元格的格式。

要从原始excel文件采用相同的格式,我正在使用HSSFCellStyle

这是我的代码:

私人声明:

private HSSFRow row1;
private HSSFCell cell1;
private HSSFCellStyle cellStyle1;
private FileInputStream inFile1,inFile2;
private HSSFSheet excelSheet1=null,excelSheet2=null;
private HSSFWorkbook excelBook1=null,excelBook2=null;

主要方法:

public static void main(String args[]){
    appendToExcelClass test = new appendToExcelClass();
    test.appendToExcel(new File("C:\\excel1.xls"),new File("C:\\excel2.xls"));
}

附加内容的方法:

public void appendToExcel(File file1,File file2){
    try{
        if(file1.exists() && file2.exists()){
            inFile1 = new FileInputStream(file1);
            inFile2 = new FileInputStream(file2);
            excelBook1 = new HSSFWorkbook(inFile1);
            excelBook2 = new HSSFWorkbook(inFile2);
            excelSheet1 = excelBook1.getSheetAt(0);
            excelSheet2 = excelBook2.getSheetAt(0);
            Iterator rowIter = excelSheet2.rowIterator();
            while(rowIter.hasNext()){
                HSSFRow myRow = (HSSFRow) rowIter.next();
                Iterator cellIter = myRow.cellIterator();
                List<String> cellStoreVector;
                cellStoreVector = new ArrayList<>();
                while(cellIter.hasNext()){
                    HSSFCell myCell = (HSSFCell) cellIter.next();
                    String cellvalue = myCell.getStringCellValue();
                    cellStyle1 = myCell.getCellStyle();  /*The problem is in this part, I think I didn't get well how get the cell's format*/
                    cellStoreVector.add(cellvalue);
                }
                row1 = excelSheet1.createRow(excelSheet1.getLastRowNum()+1);
                cell1 = row1.createCell(0);
                cell1.setCellStyle(cellStyle1);  /*At the moment to execute this part, it throws this: This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a different workbook?*/
                cell1.setCellValue(cellStoreVector.get(0).toString());
            }
            FileOutputStream outFile1 = new FileOutputStream(file1);
            excelBook1.write(outFile1);
            outFile1.close();
        }
    }catch(Exception ex){
        ex.printStackTrace();
    }
}

我不确定那个会把错误抛给我的部分。

事先,谢谢。

2 个答案:

答案 0 :(得分:2)

错误消息几乎解释了这个问题。 HSSFWorkbook包含可以使用的所有样式的表。每当调用setCellStyle时,传入的HSSFCellStyle必须位于该表中。发生的事情是excelBook1中不存在从excelBook2中的单元格中提取的HSSFCellStyle。

要更正此问题,您可以调用excelBook1.createCellStyle来创建新样式,并从提取的样式中克隆其属性。以下是如何执行此操作的示例。

HSSFCellStyle newStyle = excelBook1.createCellStyle();
newStyle.cloneStyleFrom(cellStyle1);

答案 1 :(得分:2)

我发布了第二个答案,因为我认为第一个答案虽然不完整但很有用。基本问题是我在第一个答案中确定的 - 每个工作簿都有一个相关样式表,你必须确保excelBook2中的所有样式也出现在excelBook1中。

然而,最大的问题是,你如何知道excelBook1中缺少excelBook2的哪些样式?以下是两个更详细解释问题的链接:

Why is a cloned HSSFCellStyle not equal to the style it was cloned from?

http://apache-poi.1045710.n5.nabble.com/HSSFCellStyle-help-td2295062.html

现在让我概述一下我为解决这个问题必须采取的措施。

a)编写一个包含以下足迹的方法:

public boolean stylesAreEquivalent(HSSFCellStyle style1, HSSFCellStyle style2)

在此方法中,将style1中的每个属性与style2中的相同属性进行比较。这包括对齐,边框样式,各种颜色的rgb值,字体名称,字体大小等。如果两种样式中的所有底层属性都相同,则该方法将返回true。

b)创建以下HashMap

HashMap<short,HSSFCellStyle> book2Styles = new HashMap<short,HSSFCellStyle>();

此地图将使用您从HSSFCellStyle.getIndex()获得的值编入索引。

c)从您希望从book2复制到book1的单元格中获取样式。使用getIndex获取其索引。执行以下代码:

HSSFCellStyle styleFromMap = book2Styles.get(index);

如果styleFromMap不为null,请转到下面的步骤d)。

如果styleFromMap为null,那么您需要做的是找出book1中是否存在可以使用的等效样式。您可以通过在book1中的每个样式上调用stylesAreEquivalent方法来查找是否有匹配。如果匹配,则执行以下代码:

book2Styles.put(index, equivalentBook1Style);
styleFromMap = equivalentBook1Style;

如果没有等效的样式,那么您需要创建一个新样式并使用我之前答案中的代码克隆它。

HSSFCellStyle newStyle = excelBook1.createCellStyle();
newStyle.cloneStyleFrom(cellStyle1);
book2Styles.put(index, newStyle);
styleFromMap = newStyle;

d)使用styleFromMap中的样式将单元格从book2复制到book1。

使用此方法将最大限度地减少您必须在book1中创建的新样式的数量。由于限量400种,这很重要。

我希望有一种更简单的方法,但这绝对可行,而且代码也不多。