Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从格式为的excel文件中获取单元格值_Java_Excel_Apache Poi - Fatal编程技术网

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

Java 从格式为的excel文件中获取单元格值,java,excel,apache-poi,Java,Excel,Apache Poi,我正在尝试将excel文件表中的所有内容附加到另一个excel文件表中。除了单元格的格式外,一切正常 为了从原始excel文件中获取相同的格式,我使用了HSSFCellStyle 这是我的代码: 私人声明: private HSSFRow row1; private HSSFCell cell1; private HSSFCellStyle cellStyle1; private FileInputStream inFile1,inFile2; private HSSFSheet excelSh

我正在尝试将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();
    }
}
public void appendToExcel(文件file1、文件file2){
试一试{
if(file1.exists()&&file2.exists()){
inFile1=新文件输入流(文件1);
inFile2=新文件输入流(文件2);
excelBook1=新的HSSF工作手册(填充1);
excelBook2=新的HSSF工作手册(填充2);
excelSheet1=excelBook1.getSheetAt(0);
excelSheet2=excelBook2.getSheetAt(0);
迭代器rowIter=excelSheet2.rowIterator();
while(rowIter.hasNext()){
HSSFRow myRow=(HSSFRow)rowIter.next();
迭代器cellIter=myRow.cellIterator();
列出向量;
cellStoreVector=新的ArrayList();
while(cellIter.hasNext()){
HSSFCell myCell=(HSSFCell)cellIter.next();
String cellvalue=myCell.getStringCellValue();
cellStyle1=myCell.getCellStyle();/*问题在于这一部分,我想我没有弄清楚如何获取单元格的格式*/
cellStoreVector.add(cellvalue);
}
row1=excelSheet1.createRow(excelSheet1.getLastRowNum()+1);
cell1=row1.createCell(0);
cell1.setCellStyle(cellStyle1);/*在执行此部分时,它抛出以下内容:此样式不属于提供的工作簿。是否尝试将一个工作簿中的样式分配给其他工作簿的单元格*/
cell1.setCellValue(cellStoreVector.get(0.toString());
}
FileOutputStream outFile1=新的FileOutputStream(file1);
excelBook1.编写(outFile1);
出口1.关闭();
}
}捕获(例外情况除外){
例如printStackTrace();
}
}
我不确定是哪个部分让我犯了错误


请提前通知,谢谢。

错误消息基本上解释了这个问题。HSSF工作簿包含可使用的所有样式的表格。无论何时调用setCellStyle,传入的HSSFCellStyle必须位于该表中。发生的情况是,从excelBook2中的单元格提取的HSSFCellStyle在excelBook1中不存在

要更正此问题,可以调用excelBook1.createCellStyle创建新样式,并从提取的样式克隆其属性。下面是一个如何做到这一点的示例

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

错误消息基本上解释了这个问题。HSSF工作簿包含可使用的所有样式的表格。无论何时调用setCellStyle,传入的HSSFCellStyle必须位于该表中。发生的情况是,从excelBook2中的单元格提取的HSSFCellStyle在excelBook1中不存在

要更正此问题,可以调用excelBook1.createCellStyle创建新样式,并从提取的样式克隆其属性。下面是一个如何做到这一点的示例

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

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

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

现在,让我概述一下我的建议,你必须做些什么来克服这个问题

a) 编写具有以下示意图的方法:

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

b) 创建以下HashMap

HashMap<short,HSSFCellStyle> book2Styles = new HashMap<short,HSSFCellStyle>();
如果styleFromMap不为null,请转至下面的步骤d)

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

HSSFCellStyle styleFromMap = book2Styles.get(index);
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种样式的限制,这一点很重要


我希望有一个更简单的方法,但这肯定是可行的,不会有那么多代码。

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

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

现在,让我概述一下我的建议,你必须做些什么来克服这个问题

a) 编写具有以下示意图的方法:

public boolean stylesAreEquivalent(HSSFCellStyle style1, HSSFCellStyle style2)
在这个方法中,将style1中的每个属性与style2中的相同属性进行比较。这包括对齐方式、边框样式、各种颜色的rgb值、字体名称、字体大小等。如果所有基础属性都为t,则该方法将返回true