有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

excel Java POI将工作簿转换为文件

我需要返回一个工作簿,但已转换为Java File对象。 目前我只知道如何用workbook.write(outputStream)将工作簿写入磁盘。但是,我想返回File对象,以便直接使用它进行进一步处理(上传到Amazon)

我的代码:

public File addErrorColumnToExcel(MultipartFile file, HashMap<Integer, String> errors, int newColumnIndex) throws IOException {
    Workbook workbook = null;
    Sheet sheet = null;
    Row row;
    Cell newErrorCell;
    String errorText;

    try {
      workbook = new XSSFWorkbook(new BufferedInputStream(file.getInputStream()));
      sheet = workbook.getSheetAt(FIRST_SHEET_INDEX);
    } catch (IOException e) {
      logger.error("cannot get the file: " + file.getOriginalFilename() + e);
    }

    //do some logic

    return workbook; //but I need to convert this to a java File
  }

共 (1) 个答案

  1. # 1 楼答案

    您可以创建一个临时文件,并在返回之前将数据写入该文件。处理后不要忘记删除文件。下面是一个简化的片段:

    public File getEmptyExcelFile() throws IOException {
        try (Workbook workbook = new XSSFWorkbook()) {
    
            workbook.createSheet("test"); // do some logic
    
            File outputFile = File.createTempFile("temp", ".xlsx");
            try (FileOutputStream fos = new FileOutputStream(outputFile)) {
                workbook.write(fos);
            }
            return outputFile;
        }
    }
    

    注意,我对XSSFWorkbookFileOutputStream使用了try with资源


    另一个想法是返回字节数组byte[],而不是File。这是一个更干净的解决方案,不会将文件写入磁盘

    public byte[] getEmptyExcelFileAsBytes() throws IOException {
        try (Workbook workbook = new XSSFWorkbook()) {
    
            workbook.createSheet("test"); // do some logic
    
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            workbook.write(baos);
            return baos.toByteArray();
        }
    }