【发布时间】:2018-02-16 06:35:23
【问题描述】:
是的,听起来像是重复的。
我在 Intellij 上练习了一点 Java,并尝试编写一个程序来将 .xls excel 文件导入 mysql 数据库。重复的问题,是的,但是在互联网上拖网并没有多少收获。
我下面的代码目前可以完美地导入任何 xls 文件。不幸的是,它对 .csv 文件和 xlsx 文件都没有任何作用。
当我尝试使用 .csv 文件时,会引发以下错误:
Invalid header signature; read 0x6972702C74786574, expected 0xE11AB1A1E011CFD0 - Your file appears not to be a valid OLE2 document
当使用 xlsx 文件时,会抛出以下错误:
Exception in thread "main" org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:152)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:140)
at org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:302)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:85)
at FileExport.main(FileExport.java:21)
我的代码:
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
public class FileExport {
public static void main(String[] args) throws Exception {
try {
Class forName = Class.forName("com.mysql.jdbc.Driver");
Connection con = null;
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false", "root", "root");
con.setAutoCommit(false);
PreparedStatement pstm = null;
FileInputStream input = new FileInputStream("/Users/User/Desktop/Email/Test.xls");
POIFSFileSystem fs = new POIFSFileSystem(input);
Workbook workbook;
workbook = WorkbookFactory.create(fs);
Sheet sheet = workbook.getSheetAt(0);
Row row;
for (int i = 1; i <= sheet.getLastRowNum(); i++) {
row = (Row) sheet.getRow(i);
String text = row.getCell(0).getStringCellValue();
int price = (int) row.getCell(1).getNumericCellValue();
String sql = "INSERT INTO testtable (text, price) VALUES('" + text + "','" + price + "')";
pstm = (PreparedStatement) con.prepareStatement(sql);
pstm.setString(1, text);
pstm.setInt(2, price);
pstm.execute();
System.out.println("Import rows " + i);
}
con.commit();
pstm.close();
con.close();
input.close();
System.out.println("Success import excel to mysql table");
} catch (IOException e) {
}
}
}
非常感谢任何有关如何调整此代码以导入 .csv 或 xlsx 文件的建议。
【问题讨论】:
-
您可以读取文件并自行解析,而无需使用 POIFS。解析 .csv 非常简单。只需逐行读取文件,并在分隔符处拆分行(并不总是逗号)。
-
原谅我的无知,但是你能解释一下解析和这个有什么区别吗?我在我的谷歌冒险中在线看到它,但无法真正了解解析文件的实际作用。
-
@PeterBruins,这是一个糟糕的建议。 CSV 有许多边缘情况。 tburette.github.io/blog/2014/05/25/…也和问题关系不大。
标签: java mysql excel csv intellij-idea