Java实现XLS转换为XLSX的示例代码详解

0
(0)

一、技术选型:Apache POI核心组件

Apache POI是处理Office文档的权威Java库,其中HSSF模块用于操作.xls格式文件,而XSSF模块则用于处理.xlsx格式文件。要实现.xls到.xlsx的转换,项目中需要引入以下依赖:



    org.apache.poi
    poi
    5.2.3


    org.apache.poi
    poi-ooxml
    5.2.3

二、转换流程分步解析

1. 读取.xls文件

使用HSSFWorkbook类来加载旧版Excel文件:

try (FileInputStream fis = new FileInputStream("input.xls");
    HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fis)) {

    // 读取第一个工作表
    HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(0);
    // 后续处理逻辑
}

2. 创建.xlsx工作簿

通过XSSFWorkbook类创建一个新的.xlsx工作簿对象:

XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
XSSFSheet xssfSheet = xssfWorkbook.createSheet(hssfSheet.getSheetName());

3. 复制核心内容

需要处理的内容包括单元格内容、样式、合并区域等元素。

3.1 单元格内容复制

for (Row row : hssfSheet) {
    XSSFRow xssfRow = xssfSheet.createRow(row.getRowNum());
    for (Cell cell : row) {
        XSSFCell xssfCell = xssfRow.createCell(cell.getColumnIndex());
        // 处理不同数据类型
        switch (cell.getCellType()) {
            case STRING:
                xssfCell.setCellValue(cell.getStringCellValue());
                break;
            case NUMERIC:
                xssfCell.setCellValue(cell.getNumericCellValue());
                break;
            // 处理其他类型(布尔值、公式等)
        }
    }
}

3.2 样式克隆

需要深度复制单元格样式(字体、边框、背景等):

XSSFCellStyle newStyle = xssfWorkbook.createCellStyle();
newStyle.cloneStyleFrom(cell.getCellStyle()); // 仅克隆基础样式
// 需额外处理字体(因样式不包含字体对象)
XSSFFont font = xssfWorkbook.createFont();
font.setFontName(cell.getCellStyle().getFontName());
// ...复制其他字体属性
newStyle.setFont(font);
xssfCell.setCellStyle(newStyle);

3.3 合并区域处理

for (int i = 0; i 

4. 处理特殊元素

  • 公式计算:需要重新计算公式(.xlsx使用不同公式引擎)

    xssfWorkbook.setForceFormulaRecalculation(true);
  • 图片/图表:需要使用Drawing对象单独处理

  • 条件格式:通过XSSFConditionalFormatting复制规则

java.webp

三、完整转换工具类实现

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.io.*;

public class XlsToXlsxConverter {

    public static void convert(String inputPath, String outputPath) throws IOException {
        try (HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(inputPath));
             XSSFWorkbook xssfWorkbook = new XSSFWorkbook()) {

            for (int i = 0; i 

四、性能优化方案

对于大文件(10万行+),可以通过以下优化策略提升处理效率:

  1. 内存管理

    // 使用SXSSFWorkbook进行流式处理
    SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(100); // 保留100行在内存中
  2. 分块读取

    hssfWorkbook.getSheetAt(0).setRowSumsBelow(false); // 禁用自动求和
  3. 禁用自动计算

    xssfWorkbook.setForceFormulaRecalculation(false);

五、常见问题处理

Q1: 转换后日期格式异常

  • 原因:HSSF和XSSF的日期处理机制不同
  • 解决方案:统一使用DataFormat对象
DataFormat format = xssfWorkbook.createDataFormat();
cellStyle.setDataFormat(format.getFormat("yyyy-mm-dd"));

Q2: 合并单元格失效

  • 确保在复制行之后调用addMergedRegion
  • 使用CellRangeAddress的精确坐标

Q3: 公式计算结果为0

  • 转换后需手动触发计算:
FormulaEvaluator evaluator = xssfWorkbook.getCreationHelper().createFormulaEvaluator();
evaluator.evaluateAll();

六、验证转换结果

可以使用以下代码验证关键要素:

// 检查行数和列数
assert xssfSheet.getPhysicalNumberOfRows() == hssfSheet.getPhysicalNumberOfRows();

// 检查单元格值
XSSFCell destCell = xssfSheet.getRow(0).getCell(0);
HSSFCell srcCell = hssfSheet.getRow(0).getCell(0);
assertEquals(srcCell.getStringCellValue(), destCell.getStringCellValue());

// 检查样式一致性
assertEquals(srcCell.getCellStyle().getFillForegroundColor(),
            destCell.getCellStyle().getFillForegroundColor());

七、总结与扩展方向

本文提供的转换方案实现了以下功能:

  • 基础数据迁移
  • 样式保留
  • 合并区域处理

可扩展的方向包括:

  1. 添加图片/图表转换
  2. 支持条件格式转换
  3. 实现批量文件处理
  4. 添加进度监控

通过Apache POI的深度定制,可以构建企业级Excel转换解决方案,满足金融、报表等领域的复杂需求。实际开发中需特别注意内存管理,避免处理超大文件时发生OOM错误。

文章目录

共计0人评分,平均0

到目前为止还没有投票~

很抱歉,这篇文章对您没有用!

告诉我们如何改善这篇文章?

文章标题:Java实现XLS转换为XLSX的示例代码详解
更新时间:2025年06月09日 10时51分58秒
文章链接:https://www.sokb.cn/soyi-6170.html
文章版权:易搜资源网所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系我们!
Like (0)
Previous 10小时前
Next 9小时前

相关推荐

发表回复

Please Login to Comment