weixin_43105134 2025-01-20 19:06 采纳率: 0%
浏览 16

使用poi5将多个.xls文件第一个sheet文件内容依次按行复制到模板文件中复制过程没有报错,写入时报空指针异常,模板文件变为0kb

背景:使用poi5将多个.xls文件第一个sheet文件内容依次按行复制到模板文件中,并提供下载
问题描述:复制过程没有报错,写入时报空指针异常,模板文件变为0kb。
报错信息:

 Exception in thread "main" java.lang.NullPointerException
    at org.apache.poi.hssf.record.FormatRecord.getDataSize(FormatRecord.java:110)
    at org.apache.poi.hssf.record.StandardRecord.getRecordSize(StandardRecord.java:38)
    at org.apache.poi.hssf.model.InternalWorkbook.getSize(InternalWorkbook.java:1072)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.getBytes(HSSFWorkbook.java:1474)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1386)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1374)

猜测是使用newExcelStyle.cloneStyleFrom(tmpStyles) 复制了错误的样式导致。tmpStyles不为空,此方法也有trycatch处理。
问题:如何处理xls文件,复现此问题?

  • 写回答

4条回答 默认 最新

  • master_chenchengg 2025-01-23 17:48
    关注

    答案来星火AI,希望能对题主有所帮助!

    问题分析

    在使用Apache POI库处理Excel文件时,遇到将多个.xls文件的第一个sheet内容复制到一个模板文件中,过程中没有报错,但在写入时出现空指针异常,导致模板文件变为0kb。这个问题可能由多种原因引起,包括文件路径错误、文件流未正确关闭、对象未初始化等。

    解决方案

    1. 检查文件路径和文件名:确保所有文件路径和文件名都是正确的,并且文件存在。
    2. 确保文件流正确关闭:在读取和写入文件时,确保文件流被正确关闭,以避免资源泄漏。
    3. 初始化对象:确保所有需要的对象都被正确初始化。
    4. 调试日志:添加调试日志,以便更好地了解程序的执行流程和定位问题。

    示例代码

    以下是一个使用Apache POI库将多个.xls文件的第一个sheet内容依次复制到模板文件中的示例代码:

    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.*;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.List;
    
    public class ExcelMerger {
        public static void main(String[] args) {
            // 模板文件路径
            String templatePath = "template.xls";
            // 要合并的文件列表
            List<String> filesToMerge = List.of("file1.xls", "file2.xls", "file3.xls");
    
            try (FileInputStream fisTemplate = new FileInputStream(templatePath);
                 Workbook workbookTemplate = new HSSFWorkbook(fisTemplate)) {
    
                Sheet sheetTemplate = workbookTemplate.getSheetAt(0);
                int rowIndex = sheetTemplate.getLastRowNum() + 1; // 从模板的最后一行开始追加
    
                for (String filePath : filesToMerge) {
                    try (FileInputStream fis = new FileInputStream(filePath);
                         Workbook workbook = new HSSFWorkbook(fis)) {
    
                        Sheet sheet = workbook.getSheetAt(0);
                        for (Row row : sheet) {
                            Row newRow = sheetTemplate.createRow(rowIndex++);
                            copyRow(row, newRow);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
                try (FileOutputStream fos = new FileOutputStream(templatePath)) {
                    workbookTemplate.write(fos);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private static void copyRow(Row sourceRow, Row targetRow) {
            for (Cell cell : sourceRow) {
                Cell newCell = targetRow.createCell(cell.getColumnIndex(), cell.getCellType());
                switch (cell.getCellType()) {
                    case STRING:
                        newCell.setCellValue(cell.getStringCellValue());
                        break;
                    case NUMERIC:
                        newCell.setCellValue(cell.getNumericCellValue());
                        break;
                    case BOOLEAN:
                        newCell.setCellValue(cell.getBooleanCellValue());
                        break;
                    case FORMULA:
                        newCell.setCellFormula(cell.getCellFormula());
                        break;
                    default:
                        break;
                }
            }
        }
    }
    

    关键点解释

    1. 文件输入输出流:使用FileInputStreamFileOutputStream来读取和写入文件。
    2. 工作簿和工作表:使用HSSFWorkbook类来处理.xls文件,获取工作表并操作行和单元格。
    3. 行复制:通过遍历源行的每个单元格,将其内容复制到目标行的新单元格中。
    4. 资源管理:使用try-with-resources语句确保文件流在使用后自动关闭,避免资源泄漏。
    5. 异常处理:捕获并打印IO异常,以便调试和定位问题。

    总结

    通过上述步骤和示例代码,可以有效地将多个.xls文件的第一个sheet内容依次复制到一个模板文件中。如果仍然遇到空指针异常,建议逐步调试代码,检查每一步的变量是否为null,并确保所有文件路径和文件名都是正确的。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月20日