我正在尝试将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();
}
}
我不确定那个会把错误抛给我的部分。
事先,谢谢。
答案 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种,这很重要。
我希望有一种更简单的方法,但这绝对可行,而且代码也不多。