当前位置: 首页 > 知识库问答 >
问题:

APACHE POI创建损坏的文件-无论我做了什么更改

微生俊捷
2023-03-14

我正在尝试创建包含某些值的表的Excel文件。问题是,无论我做什么,Java都会创建损坏的Excel文件(.xlsx、.xlsm)。

更改现有表的列文件的名称已损坏,如果不进行修复,则无法打开它。名称已更改,但由于某些原因,必须修复该文件。创建新表或为现有表创建新列似乎会损坏文件,但我不知道为什么。

这是我的全部代码:

package pl.TiHerbatka.Ti.ExcelWriteReadTi.Main;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFTable;
import org.apache.poi.xssf.usermodel.XSSFTableColumn;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Main {

    public static void main(String[] args) throws InvalidFormatException, IOException {
        File deleteOldFile = new File("E:\\Users\\PLACEHOLDER\\ExcelTestowy#2 — kopia.xlsx");
        if (deleteOldFile.exists()) {
            deleteOldFile.delete();
            System.out.println("Deleted!");
        }
        File fT = new File("E:\\Users\\PLACEHOLDER\\ExcelTestowy#2.xlsx");
        FileInputStream fTI = new FileInputStream(fT);
        if (deleteOldFile.exists()) {
            System.out.println("File exists!\n--------------");
        } else {
            System.out.println("File doesn't existst");
        }
        /////////////////////////////////

        XSSFWorkbook wb = new XSSFWorkbook(fTI);
        XSSFSheet sh = wb.getSheetAt(0);

        XSSFTable tb = sh.getTables().get(0);
        tb.setDisplayName("ExampleTableName"); //Works
        tb.getColumns().get(0).setName("ExampleColumnName"); // Doesn't work
        tb.createColumn("ExampleAdditionalColumnINeed"); //Doesn't work too.


        File fTO = new File("E:\\Users\\PLACEHOLDER\\ExcelTestowy#2 — kopia.xlsx");
        FileOutputStream fTOO = new FileOutputStream(fTO);
        wb.write(fTOO);


        fTOO.flush();
        fTOO.close();
        wb.close();
    }

}

附言:我是Java初学者——我在Java上有三年的Rest时间。我为我的语言道歉。

共有2个答案

边浩波
2023-03-14

Apache POI无法创建。xlsm-与包含宏的excel文件一样。

请参阅:使用ApachePOI写入xlsm(Excel2007)

吕霖
2023-03-14

在更改了XSSFTable中的表标题后,我们还需要更改工作表中的单元格值,这是表标题的表示。即使在当前apache poi 4.1.2中,poi也无法保持两个部分的更新。

以下内容适用于使用ApachePOI4.1.2的我:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFTable;

public class ExcelRenameTable {

    public static void main(String[] args) throws InvalidFormatException, IOException {

        File fT = new File("./ExcelTestowy.xlsm");
        FileInputStream fTI = new FileInputStream(fT);

        XSSFWorkbook wb = new XSSFWorkbook(fTI);
        XSSFSheet sh = wb.getSheetAt(0);

        XSSFTable tb = sh.getTables().get(0);
        tb.setDisplayName("ExampleTableName");

        tb.getColumns().get(0).setName("ExampleColumnName");
        //we also need changing the cell value in the sheet which is the representation of the table header
        int tbStartRow = tb.getStartRowIndex(); // start row of table = header row
        int tbStartCol = tb.getStartColIndex(); // start col of table = first col
        sh.getRow(tbStartRow).getCell(tbStartCol).setCellValue("ExampleColumnName");

        tb.createColumn("ExampleAdditionalColumnINeed");
        //we also need changing the cell value in the sheet which is the representation of the table header
        int tbEndCol = tb.getEndColIndex(); // end col of table = new created column
        XSSFCell cell = sh.getRow(tbStartRow).getCell(tbEndCol);
        //maybe we need creating the cell first since the column is new
        if (cell == null) cell = sh.getRow(tbStartRow).createCell(tbEndCol);
        cell.setCellValue("ExampleAdditionalColumnINeed");

        File fTO = new File("./ExcelTestowy — kopia.xlsm");
        FileOutputStream fTOO = new FileOutputStream(fTO);
        wb.write(fTOO);

        fTOO.close();
        wb.close();
    }

}
 类似资料:
  • 我正在尝试向我用SceneBuilder创建的FXML文件中存在的ChoiceBox添加值,但当我尝试这样做时(在main类中),无论我尝试什么,我都会得到一个NullPointerException。请注意,当我注释掉方法中的ChoiceBox代码(参见下面)时,项目成功运行,因此NPE没有其他原因。 null 堆栈跟踪

  • 它返回几个错误,其中大多数显示:<代码> 我对编码很陌生,我只是想用推特API制作一个有趣的机器人,但有很多错误,我不知道该怎么办。 出现的主要错误如下: (从集合导入namedtuple,映射导入错误:无法从“集合”导入名称“映射”) 谁能帮帮我吗? 出现的错误:回溯(最近一次调用):文件“C:\Users\wgama\PycharmProjects\botesquilo\botesquilo.

  • 我尝试样式复选框背景颜色,但它不会改变任何我做。我正在使用最新的火狐29。 是否在css中或浏览器中有一些规则更改? CSS: 下面是一个演示http://jsfidle.net/6kxrg/

  • 问题内容: 我使用Eclipse在Windows 7中创建了一个jar文件。当我尝试打开jar文件时,它说jar文件无效或损坏。谁能建议我为什么jar文件无效? 问题答案: 当您在Windows资源管理器中双击一个JAR文件时,会发生这种情况,但是JAR本身实际上不是 可执行的 JAR。真正的可执行JAR至少应具有带有方法的类,并在中引用它。 在Eclispe中,您需要将项目导出为 Runnabl

  • 在我的应用程序(,出现了一个向上箭头,表示,但我无法处理它来执行任何操作,甚至无法显示toast。我尝试了这个方法,并在选项ItemSelected()中处理了开关(item.getItemId()),但这两种解决方案都不适合我。我错过了一些东西,但不知道是什么。 这是我的代码: ... 我的整个选项项已选定: 我不知道其他代码是否重要: 在我的清单中,我没有父母活动。 我找到了这个答案,它似乎是

  • 问题内容: 在将Maven jFree依赖项添加到现有应用程序后,我将无法执行创建的jar。 我收到的唯一错误消息如下: 完整的外观如下所示: 如果执行jar,则不会得到其他任何调试信息。 是否可以验证jarfile?或有类似…的东西? 重现步骤: 新建一个文件夹 从上方将Pom.xml复制到该文件夹​​中。 保存小的`public static void main(…)。进入src / main