java - Apache POI - 将样式从 XSSFCell 复制到 HSSFCell
问题描述
我正在尝试将具有特定格式(自定义表)的现有 XSSFWorkbook 转换为 HSSFWorkbook,以便将其保存为 .xls 文件。
为此,我使用以下方法从 XSSFWorkbook 复制数据并将其粘贴到新的 HSSFWorkbook 中,然后再尝试复制样式。但是我不能使用 cloneStyleFrom 方法,因为它只能从一个 XSSFCell 到另一个。
您是否知道我如何继续复制每个单元格的样式并将其应用于新的 HSSF 单元格?
我考虑过的替代方法是将一个 .xls 文件添加到我的项目的资源文件夹中,其中包含一个具有正确格式的巨大空表,然后我将填充从另一个工作簿中获取的数据,然后以编程方式删除额外的列和行仍然是空的。但我并不真正喜欢这个解决方案,并想在实施之前确保没有其他解决方案。
public Workbook convert(XSSFWorkbook wb, File inpFn) throws InvalidFormatException,IOException {
XSSFWorkbook wbIn = wb;
Workbook wbOut = new HSSFWorkbook();
int sheetCnt = wbIn.getNumberOfSheets();
for (int i = 0; i < sheetCnt; i++) {
Sheet sIn = wbIn.getSheetAt(i);
Sheet sOut = wbOut.createSheet(sIn.getSheetName());
Iterator<Row> rowIt = sIn.rowIterator();
while (rowIt.hasNext()) {
Row rowIn = rowIt.next();
Row rowOut = sOut.createRow(rowIn.getRowNum());
Iterator<Cell> cellIt = rowIn.cellIterator();
while (cellIt.hasNext()) {
Cell cellIn = cellIt.next();
Cell cellOut = rowOut.createCell(cellIn.getColumnIndex(), cellIn.getCellType());
switch (cellIn.getCellType()) {
case Cell.CELL_TYPE_BLANK: break;
case Cell.CELL_TYPE_BOOLEAN:
cellOut.setCellValue(cellIn.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
cellOut.setCellValue(cellIn.getErrorCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
cellOut.setCellFormula(cellIn.getCellFormula());
break;
case Cell.CELL_TYPE_NUMERIC:
cellOut.setCellValue(cellIn.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
cellOut.setCellValue(cellIn.getStringCellValue());
break;
}
CellStyle styleIn = cellIn.getCellStyle();
CellStyle styleOut = cellOut.getCellStyle();
styleOut.setDataFormat(styleIn.getDataFormat());
//styleOut.cloneStyleFrom(styleIn); Does not work from XSSFCell to HSSFCell
cellOut.setCellStyle(styleOut);
}
}
}
return wbOut;
}
解决方案
推荐阅读
- one-time-password - Google Authenticator TOTP 和常规 TOTP 有什么区别
- python - 根据用户输入更改文件名
- mysql - MySQL 插入问题:#1136 - 列计数与第 1 行的值计数不匹配
- vue.js - 输入表单不起作用 - 更新 bootstrap-vue 版本
- python - 使用 Pytest,如何检查 API 端点返回的聚合是否正确?
- drools - Drools,无法在决策表操作中访问 HashMap
- android - ContentResolver 查询不返回新插入的视频
- unity3d - 为虚拟现实统一映射现实世界
- mysql - 无法使用我的本地笔记本电脑连接到在 Azure 上的 Linux(ubuntu 16.04)虚拟机上运行的 MySQL
- c++ - 如何从 C++ 中的代码显示文本文件?