将受保护的xls转换为csv java

将受保护的xls转换为csv java,java,apache-poi,Java,Apache Poi,我正在尝试将xls文件转换为csv。 问题是xls文件(我无法更改)是excel 2工作表版本,当您打开它时,会收到以下消息: “由于您的策略设置,不允许受保护视图编辑此文件类型。单击以获取详细信息。” 因此,我无法转换xls文件,因为我遇到以下异常: Exception in thread "main" org.apache.poi.poifs.filesystem.NotOLE2FileException: Invalid header signature; read 0x001000020

我正在尝试将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)
线程“main”org.apache.poi.poifs.filesystem.NotOLE2FileException中的异常:头签名无效;读取0x0010002000040009,应为0xE11AB1A1E011CFD0-您的文件似乎不是有效的OLE2文档 位于org.apache.poi.poifs.storage.HeaderBlock(HeaderBlock.java:151) 位于org.apache.poi.poifs.storage.HeaderBlock(HeaderBlock.java:117) 位于org.apache.poi.poifs.filesystem.poifsffilesystem.(poifsffilesystem.java:294) 在org.apache.poi.hssf.usermodel.HSSFWorkbook上(HSSFWorkbook.java:400) 在org.apache.poi.hssf.usermodel.HSSFWorkbook.(HSSFWorkbook.java:381) 位于exceltosv.exceltosv.main(exceltosv.java:41) 出于测试目的,我删除了保护,这样我就可以将xls文件保存到新的xls中,并且可以正常工作。但是我不希望用户在运行代码之前操作文件

这是我从中得到的代码

试试看(
FileInputStream input\u document=newfileinputstream(新文件(“C:\\Users\\afusa\\Documents\\NetBeansProjects\\exceltosv\\src\\exceltosv\\201904TM.xls”)){
HSSFWorkbook my_xls_工作簿=新的HSSFWorkbook(输入文档);
HSSFSheet my_sheet=my_xls_工作簿。getSheetAt(0);
迭代器rowIterator=我的工作表。迭代器();
FileWriter my_csv=新的FileWriter(“C:\\Users\\afusa\\Documents\\NetBeansProjects\\exceltosv\\src\\exceltosv\\convertedCSVFile.csv”);
try(CSVWriter my_csv_output=new CSVWriter(my_csv)){
while(roweiterator.hasNext()){
行=行迭代器。下一步();
int i=0;
字符串[]csvdata=新字符串[35];
迭代器cellIterator=row.cellIterator();
while(cellIterator.hasNext()){
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文件的情况下实现此转换?

excel到CSV的转换

package test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class ExcelReading {

    public static void echoAsCSV(Sheet sheet) throws IOException {
       StringBuffer sb=new StringBuffer();
        Row row = null;
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            row = sheet.getRow(i);
            for (int j = 0; j < row.getLastCellNum(); j++) {
                sb.append(row.getCell(j) +",");
            }
            sb.append("\n");

        }

        FileOutputStream filout=new FileOutputStream("D:/fileOut.csv");
        byte[] strToBytes = sb.toString().getBytes();         
        filout.write(strToBytes);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        InputStream inp = null;
        try {
            inp = new FileInputStream("D:\\Book1.xlsx");
            Workbook wb = WorkbookFactory.create(inp);

            for(int i=0;i<wb.getNumberOfSheets();i++) {
                System.out.println(wb.getSheetAt(i).getSheetName());
                echoAsCSV(wb.getSheetAt(i));
            }
        } catch (InvalidFormatException ex) {
            Logger.getLogger(ExcelReading.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ExcelReading.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ExcelReading.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                inp.close();
            } catch (IOException ex) {
                Logger.getLogger(ExcelReading.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
封装测试;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入org.apache.poi.openxml4j.exceptions.InvalidFormatException;
导入org.apache.poi.ss.usermodel.Row;
导入org.apache.poi.ss.usermodel.Sheet;
导入org.apache.poi.ss.usermodel.工作簿;
导入org.apache.poi.ss.usermodel.WorkbookFactory;
公共课精读{
公共静态无效echoAsCSV(图纸)引发IOException{
StringBuffer sb=新的StringBuffer();
行=空;

对于(int i=0;i NPOIFSFileSystem fileSystem=new NPOIFSFileSystem(new File(“…”),true);Biff8EncryptionKey.setCurrentUserPassword(pwd);工作簿=new HSSFWorkbook(fileSystem);Apache POI有一些代码用于处理非常旧的Excel文件,用于文本提取,您的程序可能基于此?请参阅
package test;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class ExcelReading {

    public static void echoAsCSV(Sheet sheet) throws IOException {
       StringBuffer sb=new StringBuffer();
        Row row = null;
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            row = sheet.getRow(i);
            for (int j = 0; j < row.getLastCellNum(); j++) {
                sb.append(row.getCell(j) +",");
            }
            sb.append("\n");

        }

        FileOutputStream filout=new FileOutputStream("D:/fileOut.csv");
        byte[] strToBytes = sb.toString().getBytes();         
        filout.write(strToBytes);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        InputStream inp = null;
        try {
            inp = new FileInputStream("D:\\Book1.xlsx");
            Workbook wb = WorkbookFactory.create(inp);

            for(int i=0;i<wb.getNumberOfSheets();i++) {
                System.out.println(wb.getSheetAt(i).getSheetName());
                echoAsCSV(wb.getSheetAt(i));
            }
        } catch (InvalidFormatException ex) {
            Logger.getLogger(ExcelReading.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ExcelReading.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ExcelReading.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                inp.close();
            } catch (IOException ex) {
                Logger.getLogger(ExcelReading.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}