Я пытаюсь преобразовать файл xls в csv.Проблема в том, что файл xls (который я не могу изменить) входит в версию Excel 2, и когда вы открываете его, вы получаете следующее сообщение: «Защищенный просмотр Редактирование этого типа файла не разрешено из-за параметров вашей политики. Нажмитедля получения более подробной информации. "
Поэтому я не могу преобразовать файл xls, так как получаю следующее исключение:
Exception in thread "main" org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature; read 0x0010000200040009, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:151)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:117)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:294)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:400)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:381)
at exceltocsv.ExcelToCSV.main(ExcelToCSV.java:41)
В целях тестирования я снял защиту, чтобы сохранить xlsфайл в новый xls, и это работает.Но я не хочу, чтобы пользователь манипулировал файлом перед запуском кода.
Вот код, который я получил от http://thinktibits.blogspot.com/2012/12/convert-xls-to-csv-in-java-example.html
try (
FileInputStream input_document = new FileInputStream(new File("C:\\Users\\afusa\\Documents\\NetBeansProjects\\ExcelToCSV\\src\\exceltocsv\\201904TM.xls"))) {
HSSFWorkbook my_xls_workbook = new HSSFWorkbook(input_document);
HSSFSheet my_worksheet = my_xls_workbook.getSheetAt(0);
Iterator<Row> rowIterator = my_worksheet.iterator();
FileWriter my_csv = new FileWriter("C:\\Users\\afusa\\Documents\\NetBeansProjects\\ExcelToCSV\\src\\exceltocsv\\convertedCSVFile.csv");
try (CSVWriter my_csv_output = new CSVWriter(my_csv)) {
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
int i = 0;
String[] csvdata = new String[35];
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
CellType cellType = cell.getCellType();
if (cellType == CellType.STRING || cellType == CellType.BLANK) {
csvdata[i] = cell.getStringCellValue();
} else if (cellType == CellType.NUMERIC) {
csvdata[i] = String.valueOf(cell.getNumericCellValue());
}
i = i + 1;
}
my_csv_output.writeNext(csvdata);
}
}
}
Есть ли способ добиться этого преобразованиябез необходимости пользователем манипулировать файлом excel заранее?