Java POI API:从*转换。xlsx * xls

时间:2021-04-12 20:24:45

I have a small problem. Wanna convert the new excel files (.xlsx) into the old one (.xls) with the POI API on Java.

我有一个小问题。想要将新的excel文件(.xlsx)转换为使用Java的POI API的旧excel文件(.xls)。

I think it is a mind problem, but I don't know which fault exist.

我认为这是一个心理问题,但我不知道存在哪一个错误。

I used these code here:

我在这里用了这些代码:

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
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.xssf.usermodel.XSSFWorkbook;

public class XLSX2XLS{
    private String outFn;
    private File inpFn;

    public XLSX2XLS(File inpFn){
        this.outFn = inpFn + ".xls";
        this.inpFn = inpFn;
    }

    public void xlsx2xls_progress() throws InvalidFormatException,IOException {
        InputStream in = new FileInputStream(inpFn);
        try {
            XSSFWorkbook wbIn = new XSSFWorkbook(in);
            File outF = new File(outFn);
            if (outF.exists()) {
                outF.delete();
            }

            Workbook wbOut = new HSSFWorkbook();
            int sheetCnt = wbIn.getNumberOfSheets();
            for (int i = 0; i < sheetCnt; i++) {
                Sheet sIn = wbIn.getSheetAt(0);
                Sheet sOut = wbOut.createSheet(sIn.getSheetName());
                Iterator<Row> rowIt = sIn.rowIterator();
                while (rowIt.hasNext()) {
                    Row rowIn = rowIt.next();
                    Row rowOut = sOut.createRow(rowIn.getRowNum());

                    Iterator<Cell> cellIt = rowIn.cellIterator();
                    while (cellIt.hasNext()) {
                        Cell cellIn = cellIt.next();
                        Cell cellOut = rowOut.createCell(cellIn.getColumnIndex(), cellIn.getCellType());

                        switch (cellIn.getCellType()) {
                        case Cell.CELL_TYPE_BLANK: break;

                        case Cell.CELL_TYPE_BOOLEAN:
                            cellOut.setCellValue(cellIn.getBooleanCellValue());
                            break;

                        case Cell.CELL_TYPE_ERROR:
                            cellOut.setCellValue(cellIn.getErrorCellValue());
                            break;

                        case Cell.CELL_TYPE_FORMULA:
                            cellOut.setCellFormula(cellIn.getCellFormula());
                            break;

                        case Cell.CELL_TYPE_NUMERIC:
                            cellOut.setCellValue(cellIn.getNumericCellValue());
                            break;

                        case Cell.CELL_TYPE_STRING:
                            cellOut.setCellValue(cellIn.getStringCellValue());
                            break;
                        }

                        {
                            CellStyle styleIn = cellIn.getCellStyle();
                            CellStyle styleOut = cellOut.getCellStyle();
                            styleOut.setDataFormat(styleIn.getDataFormat());
                        }cellOut.setCellComment(cellIn.getCellComment());

                        }
                }
            }
            OutputStream out = new BufferedOutputStream(new FileOutputStream(outF));
            try {
                wbOut.write(out);
            } finally {
                out.close();
            }
        } finally {
            in.close();
        }
    }
}

And Java tells me that here:

Java告诉我:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException
    at XLSX2XLS.xlsx2xls_progress(XLSX2XLS.java:35)
    at Workflow.main(Workflow.java:32)
Caused by: java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlException
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 2 more

I test these class with POI 3.9. and 3.10, on both the same error calls. Java: JDK 7 OS: Win 8.1 x64

我用POI 3.9测试这些类。在相同的错误调用中,3.10。Java: JDK 7 OS: Win 8.1 x64。

I hope get enough information about my problem. Thanks for your helps.

我希望能得到关于我的问题的足够的信息。谢谢你的帮助。

Greetings

问候

1 个解决方案

#1


5  

Please be aware that as the new XSSF supported Excel 2007 OOXML (.xlsx) files are XML based.

请注意,由于新的XSSF支持Excel 2007 OOXML (.xlsx)文件是基于XML的。

You need to add extra 2 jars to make POI work on (.xlsx) Excel file.

您需要添加额外的两个jar以使POI在(.xlsx) Excel文件中工作。

Please add xmlbeans2.3.0.jar and dom4j-1.6.jar to your classpath. These 2 jars are the dependency jars for handling .xlsx Excel file in POI Library.

请添加xmlbeans2.3.0。jar和dom4j - 1.6。jar到类路径中。这两个jar是用于在POI库中处理.xlsx Excel文件的依赖项jar。

If you have download POI source code, You can find these 2 jars under the following folder:

如果您下载了POI源代码,您可以在以下文件夹中找到这两个jar:

\poi-bin-3.9-20121203\poi-3.9\ooxml-lib\

\ poi -本- 3.9 - 3.9 \ poi - 3.9 \ ooxml-lib \

If not, you can download them from the following site:

如果没有,你可以从以下网站下载:

xmlBean2.3.0.jar

xmlBean2.3.0.jar

dom4j-1.6.jar

dom4j-1.6.jar

#1


5  

Please be aware that as the new XSSF supported Excel 2007 OOXML (.xlsx) files are XML based.

请注意,由于新的XSSF支持Excel 2007 OOXML (.xlsx)文件是基于XML的。

You need to add extra 2 jars to make POI work on (.xlsx) Excel file.

您需要添加额外的两个jar以使POI在(.xlsx) Excel文件中工作。

Please add xmlbeans2.3.0.jar and dom4j-1.6.jar to your classpath. These 2 jars are the dependency jars for handling .xlsx Excel file in POI Library.

请添加xmlbeans2.3.0。jar和dom4j - 1.6。jar到类路径中。这两个jar是用于在POI库中处理.xlsx Excel文件的依赖项jar。

If you have download POI source code, You can find these 2 jars under the following folder:

如果您下载了POI源代码,您可以在以下文件夹中找到这两个jar:

\poi-bin-3.9-20121203\poi-3.9\ooxml-lib\

\ poi -本- 3.9 - 3.9 \ poi - 3.9 \ ooxml-lib \

If not, you can download them from the following site:

如果没有,你可以从以下网站下载:

xmlBean2.3.0.jar

xmlBean2.3.0.jar

dom4j-1.6.jar

dom4j-1.6.jar