1 回答
TA贡献1851条经验 获得超4个赞
好吧,XSSFTable.更新标题应该可以做到这一点,如果这样做不会失败的话。apache poi
以下所有操作都是使用 完成的。apache poi 4.0.1
我已经下载了你的,然后尝试更改工作表中的表格列标题。但即使调用了列名之后,在 中也没有改变。因此,我查看了 XSSFTable.java -> 更新标题以确定为什么不会发生这种情况。在那里,我们发现:dummy_template.xlsx
XSSFTable.updateHeaders
XSSFTable
if (row != null && row.getCTRow().validate()) {
//do changing the column names
}
因此,仅当工作表中的相应行根据名称空格有效时,才会更改列名称。但在后来的版本中(2007年之后),增加了额外的命名空间。在本例中,该行如下所示:XMLOffice Open XMLExcelXML
<row r="4" spans="1:3" x14ac:dyDescent="0.25">
请注意附加属性。这就是返回的原因。x14ac:dyDescentrow.getCTRow().validate()false
以下代码获取您的 ,重命名工作表中的列标题,然后调用解除版本。之后,在 中打开 有效。dummy_template.xlsxstatic void updateHeaders(XSSFTable table)result.xlsxExcel
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.ss.util.cellwalk.*;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
import java.io.*;
import java.util.*;
class ExcelRenameTableColumns {
static void translateHeaders(Sheet sheet, final Map<String,String> header, int headerrownumber) {
CellRangeAddress address = new CellRangeAddress(
headerrownumber, headerrownumber,
0, sheet.getRow(headerrownumber).getLastCellNum());
CellWalk cellWalk = new CellWalk (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));
}
}
});
}
static void updateHeaders(XSSFTable table) {
XSSFSheet sheet = (XSSFSheet)table.getParent();
CellReference ref = table.getStartCellReference();
if (ref == null) return;
int headerRow = ref.getRow();
int firstHeaderColumn = ref.getCol();
XSSFRow row = sheet.getRow(headerRow);
DataFormatter formatter = new DataFormatter();
System.out.println(row.getCTRow().validate()); // false!
if (row != null /*&& row.getCTRow().validate()*/) {
int cellnum = firstHeaderColumn;
CTTableColumns ctTableColumns = table.getCTTable().getTableColumns();
if(ctTableColumns != null) {
for (CTTableColumn col : ctTableColumns.getTableColumnList()) {
XSSFCell cell = row.getCell(cellnum);
if (cell != null) {
col.setName(formatter.formatCellValue(cell));
}
cellnum++;
}
}
}
}
public static void main(String[] args) throws Exception {
String templatePath = "dummy_template.xlsx";
String outputPath = "result.xlsx";
FileInputStream inputStream = new FileInputStream(templatePath);
Workbook workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheetAt(0);
Map<String, String> header = new HashMap<String, String>();
header.put("textone", "Spalte eins");
header.put("texttwo", "Spalte zwei");
header.put("textthree", "Spalte drei");
translateHeaders(sheet, header, 3);
XSSFTable table = ((XSSFSheet)sheet).getTables().get(0);
updateHeaders(table);
FileOutputStream outputStream = new FileOutputStream(outputPath);
workbook.write(outputStream);
outputStream.close();
workbook.close();
}
}
如果我打开使用,然后另存为 ,则该行的更改更改为dummy_template.xlsxExcel 2007dummy_template2007.xlsxXML
<row r="4" spans="1:3">
现在,在使用它时,无需手动调用。由 调用的 XSSFTable.write To 会自动执行此操作。dummy_template2007.xlsxXSSFTable.updateHeadersXSSFTable.commit
添加回答
举报