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 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);    }