【发布时间】:2019-04-05 09:15:30
【问题描述】:
我正在尝试重命名现有 xlsx 文件的标题。这个想法是有一个 excel 文件来将数据从 XML 导出到 excel,并在某些用户进行调整后重新导入 XML。
目前,我们已经使用 Excel 创建了一个“模板”xlsx-sheet,其中已经包含一个可排序的表(poi 中的 XSSFTable)和一个到 XSD 源的映射。然后我们通过 POI 导入它,将 XML 数据映射到其中并保存。为了将工作表调整为用户,我们希望将这个现有表的标题/列名翻译成不同的语言。它适用于 POI 3.10-FINAL,但自从升级到 4.0.1 后,打开时会导致 xlsx 文件损坏。
我已经在 stackoverflow 上找到了这个问题 Excel file gets corrupted when i change the value of any cell in the header (Columns Title) 但它没有回答而且很旧。但我试图弄清楚 cmets 可能是什么,并试图展平现有的 XSSFTable,将填充的数据复制到新的工作表中,然后为数据添加一个新的 XSSFTable。可悲的是,这似乎很复杂,所以我回到纠正损坏的标题单元格。 我还尝试使用 POI 创建整个工作表并不再使用该“模板”-xslx,但我无法弄清楚如何实现我们的 XSD 映射(在 Excel 中它的 Developer-Tools -> Source -> Add and then mapping动态表中某些单元格的节点)
在 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));
}
}
});
}
MyCellWalk 是一个 org.apache.poi.ss.util.cellwalk.CellWalk,它遍历从左上角到右下角的单元格范围。
据我所知,仅仅更改单元格的平面值是不够的,因为 xlsx 在他们的一些地图中保留了对单元格名称的引用,但我不知道如何获取它们并重命名标题。也许还有另一种翻译标题名称的方法?
【问题讨论】:
-
如您所知,问题在于
XSSFTable中的标题不仅是工作表中的文本内容,而且是XSSFTableColumns 和的名称> 作为列说明符,如结构化引用的[ColumnName]部分。因此,当需要更改XSSFTable的标头时,所有这些都需要更改。 -
首先我会尝试在工作表中更改标题单元格值后调用XSSFTable.updateHeaders 和XSSFTable.updateReferences 是否可以解决问题。
-
我已经尝试过 updateHeaders 和 updateReferences 但遗憾的是它不起作用。桌子仍然腐烂然后打开。是否有任何提示我可以在哪里找到,哪些结构化引用需要更改?
-
“我能在哪里找到任何提示,哪些结构化引用需要更改?”:不,这里没有“模板”xlsx 文件。有很多不同的可能性。
-
我上传了一个虚拟 xlsx,这基本上是我用于我的项目的:link 在谷歌驱动器上。有一个 XSD 映射到表中,也在“参考”后面。除了更新所有参考资料外,我也对其他解决方法持开放态度,但我现在真的没有想法。我正在尝试解决这个问题一段时间,但我觉得自己真的被卡住了
标签: java excel apache-poi xssf