我正在尝试重命名现有 xlsx 文件的标头。这个想法是有一个excel文件将数据从XML导出到excel,并在一些用户进行调整后重新导入XML。
目前,我们已经创建了一个带有Excel的“模板”xlsx工作表,其中已经包含一个可排序的表格(poi中的XSSFTable)和一个到XSD源的映射。然后我们通过POI导入它,将XML数据映射到其中并保存它。为了根据用户调整工作表,我们希望将此现有表的标题/列名翻译成不同的语言。它与POI 3.10-FINAL一起使用,但自从升级到4.0.1以来,它会导致打开时xlsx文件损坏。
我发现这个问题堆栈溢出已经 Excel文件被损坏,当我改变标题(列标题)中任何单元格的值,但它没有得到回答和相当旧。但是我试图弄清楚注释可能是什么,并试图平展现有的XSSFTable,将填充的数据复制到新工作表中,然后将新的XSSFTable放在数据上。可悲的是,这似乎非常复杂,所以我又回到了纠正破碎的标题单元格。我还尝试使用POI创建整个工作表,并避免使用该“模板”-xslx,但我无法弄清楚如何实现我们的XSD映射(在Excel中,其开发人员工具->源->添加,然后将节点映射到动态表中的某些单元格)
在poi升级之前工作的代码基本上是这样的:
//Sheet is the current XSSFSheet
//header is a Map with the original header-name from the template mapped to a the new translated name
//headerrownumber is the row containing the tableheader to be translated
public static void translateHeaders(Sheet sheet,final Map<String,String> header,int headerrownumber) {
CellRangeAddress address = new CellRangeAddress(headerrownumber,headerrownumber,0,sheet.getRow(headerrownumber).getLastCellNum()); //Cellrange is the header-row
MyCellWalk cellWalk = new MyCellWalk (sheet,address);
cellWalk.traverse(new CellHandler() {
public void onCell(Cell cell, CellWalkContext ctx) {
String val = cell.getStringCellValue();
if (header.containsKey(val)) {
cell.setCellValue(header.get(val));
}
}
});
}
“我的细胞之路”是一个组织,它遍历从左上角到右下角的单元格范围。
据我所知,仅仅更改单元格的平面值是不够的,因为xlsx在一些映射中保留了对单元格名称的引用,但是我无法弄清楚如何全部获取它们并重命名标题。也许还有另一种方法来翻译标题名称?
繁花不似锦
相关分类