/ / Недійсний підпис заголовка - java, apache-poi

Недійсний підпис заголовка - java, apache-poi

Тут я хочу витягти дані з .xlsx Файл і для цього я вже додати банку poi і створив посилання на fileInputStream

package demo;


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


import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class DemoExcel {

public static void main(String[] args) throws Exception{
File excel = new File("C:\Users\Devaditya\Documents\Book1.xlsx");
FileInputStream fis = null;
fis = new FileInputStream(excel);
System.out.println(fis.toString());
HSSFWorkbook wb = new HSSFWorkbook(fis);
System.out.println(wb.toString());
HSSFSheet sh = wb.getSheet("Data");
System.out.println(sh.toString());
}

}

Ось я отримую помилку: -

Exception in thread "main" java.io.IOException: Invalid header signature; read 0, expected -2226271756974174256
at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:88)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:83)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:210)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:191)
at demo.DemoExcel.main(DemoExcel.java:23)

Відповіді:

5 за відповідь № 1

Почнемо з типів WorkBook.

HSSFWorkbook

Це старий двійковий власний формат Excel, відомий розширенням .xls.

XSSFWorkbook

Це новий формат XML Excel, відомий розширенням .xlsx.

Отже, ви використовуєте неправильний клас.

Насправді краще б не використовувати спеціальний клас взагалі, нехай POI розробляє те, що у вас є. Використовуйте a WorkbookFactory:

final Workbook workbook = WorkbookFactory.create(excel);

Це:

  1. програмування до interface.
  2. стійкий до змін у типі читання робочої книги, поки це підтримує POI
  3. швидше та ефективніше. POI може читати File по частинах, коли потрібно, а не змушувати всю пам'ять переносити всю пам'ять.
  4. У вас немає витоку пам'яті, який у вас є, коли ви не "t close() в FileInputStream.

0 для відповіді № 2

спробуйте відкрити файл в Microsoft Office Excelпотім з'явиться повідомлення про те, що цей файл, який ви намагаєтеся відкрити, не є файлом Excel, і дасть вам можливість відкрити його будь-яким способом, тому відкрийте його і збережіть у файлі excel.