首页 > 基础资料 博客日记
用poi把xls格式转换成xlsx格式
2023-09-01 18:25:10基础资料围观260次
本篇文章分享用poi把xls格式转换成xlsx格式,对你有帮助的话记得收藏一下,看Java资料网收获更多编程知识
java中要实现excel新老格式的转换比较麻烦,开源库也没几个好用的。用ChatGpt查询也是推荐直接用POI,下面是借助ChatGPT写出来的代码,经过小小修改,格式转换良好,基本能用,就是效率比较低下。将就着用吧,哎!
/** * Excel格式从xls转换成xlsx格式 * * @param xlsInputStream xls格式的输入流 * @param xlsxOutputStream xlsx格式的输出流 */ public static void convertXlsToXlsxByStream(InputStream xlsInputStream, OutputStream xlsxOutputStream) { try { HSSFWorkbook oldWorkbook = new HSSFWorkbook(xlsInputStream); XSSFWorkbook newWorkbook = new XSSFWorkbook(); for (int i = 0; i < oldWorkbook.getNumberOfSheets(); i++) { HSSFSheet oldSheet = oldWorkbook.getSheetAt(i); XSSFSheet newSheet = newWorkbook.createSheet(oldSheet.getSheetName()); // 复制单元格值、样式和格式 for (int j = 0; j <= oldSheet.getLastRowNum(); j++) { HSSFRow oldRow = oldSheet.getRow(j); XSSFRow newRow = newSheet.createRow(j); if (oldRow != null) { for (int k = 0; k < oldRow.getLastCellNum(); k++) { HSSFCell oldCell = oldRow.getCell(k); XSSFCell newCell = newRow.createCell(k); if (oldCell != null) { try { setCellValue(newCell, oldCell); copyCellStyle(newWorkbook, newCell, oldWorkbook, oldCell); } catch (Exception ex) { log.warn("单元格拷贝异常:", ex); } } } } } // 复制单元格合并信息 List<CellRangeAddress> mergedRegions = oldSheet.getMergedRegions(); for (CellRangeAddress mergedRegion : mergedRegions) { CellRangeAddress targetMergedRegion = new CellRangeAddress( mergedRegion.getFirstRow(), mergedRegion.getLastRow(), mergedRegion.getFirstColumn(), mergedRegion.getLastColumn() ); newSheet.addMergedRegion(targetMergedRegion); } } newWorkbook.write(xlsxOutputStream); oldWorkbook.close(); newWorkbook.close(); } catch (Exception e) { log.error("excel格式转换(xls->xlsx)异常:", e); } } private static void setCellValue(XSSFCell newCell, HSSFCell oldCell) { if (oldCell == null) { return; } switch (oldCell.getCellType()) { case STRING: newCell.setCellValue(oldCell.getStringCellValue()); break; case NUMERIC: if (DateUtil.isCellDateFormatted(oldCell)) { newCell.setCellValue(oldCell.getDateCellValue()); } else { newCell.setCellValue(oldCell.getNumericCellValue()); } break; case BOOLEAN: newCell.setCellValue(oldCell.getBooleanCellValue()); break; case FORMULA: newCell.setCellValue(oldCell.getCellFormula()); break; default: } } private static void copyCellStyle(XSSFWorkbook xssfWorkbook, XSSFCell newCell, HSSFWorkbook hssfWorkbook, HSSFCell oldCell) { HSSFCellStyle oldCellStyle = oldCell.getCellStyle(); // 创建一个XSSFCellStyle(新Excel格式) XSSFCellStyle newCellStyle = xssfWorkbook.createCellStyle(); // 复制HSSFCellStyle的样式属性到XSSFCellStyle newCellStyle.setAlignment(oldCellStyle.getAlignment()); newCellStyle.setVerticalAlignment(oldCellStyle.getVerticalAlignment()); // 复制字体属性 XSSFFont newFont = xssfWorkbook.createFont(); HSSFFont oldFont = oldCellStyle.getFont(hssfWorkbook); newFont.setFontName(oldFont.getFontName()); newFont.setFontHeightInPoints(oldFont.getFontHeightInPoints()); newFont.setColor(oldFont.getColor()); newCellStyle.setFont(newFont); newCellStyle.setFillForegroundColor(oldCellStyle.getFillForegroundColor()); newCellStyle.setFillPattern(oldCellStyle.getFillPattern()); // 设置单元格类型 newCellStyle.setDataFormat(oldCellStyle.getDataFormat()); newCell.setCellStyle(newCellStyle); }
文章来源:https://www.cnblogs.com/hdwang/p/17672648.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: