APACHE POI создает поврежденный файл - независимо от внесенного мною изменения - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь создать файлы Excel с таблицами, которые содержат определенные значения. Проблема в том, что Java создает испорченный файл Excel (.xlsx, .xlsm) независимо от того, что я делаю.

Изменение имени столбца таблицы EXISTING - файл поврежден, его нельзя открыть, не восстанавливая , Имя изменено, но по какой-то причине файл должен быть восстановлен. Создание новых таблиц или создание новых столбцов в существующих таблицах может повредить файлы, но я не знаю, почему.

Это весь мой код:

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

}

PS: я новичок в Java - у меня был 3 года перерыва в java. Я прошу прощения за мой язык.

Ответы [ 2 ]

2 голосов
/ 29 марта 2020

После изменения заголовков таблицы в XSSFTable нам также нужно изменить значение ячейки на листе, которое является представлением заголовка таблицы. XSSFTable и XSSFSheet - это разные XSSFWorkbook части документа, а apache poi не удерживает обе части обновленными даже в текущем apache poi 4.1.2.

. Следующее работает для меня, используя apache poi 4.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();
    }

}
0 голосов
/ 29 марта 2020

Apache POI не может создать .xlsm - как в файлах Excel с макросами.

См .: запись в xlsm (Excel 2007) с использованием apache poi

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...