我正在尝试写入Excel文件但是我一直收到错误:
线程中的异常" main" org.apache.poi.POIXMLException:org.apache.poi.openxml4j.exceptions.InvalidFormatException:包应包含内容类型部分[M1.13]
根据我的理解,我错过了一个jar文件。
任何人都可以帮我识别它是哪个文件吗?
P.S。我正在使用Netbeans。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JOptionPane;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
*
* @author nicholaskissaun
*/
public class Tester {
public static void main (String args \[\])throws FileNotFoundException, IOException, InvalidFormatException{
int RowCount = 7, iChoice;
String sChoice;
XSSFSheet s;
XSSFRow row1;
XSSFWorkbook wb;
XSSFCell r1c1, r1c2, r1c8, r1Episodes;
FileInputStream fis = new FileInputStream("/Users/nicholaskissaun/Google Drive/Grade 11_12/Computer Science/Java/Term1/src/IA/Profiles/Becky/ShowDetails.xlsx");
wb = new XSSFWorkbook(fis);
s = wb.getSheetAt(0);
}
}
答案 0 :(得分:9)
使用文件扩展名处理WorkSheet
类型
String inputFilename = new File(path).getName();
switch (inputFilename.substring(inputFilename.lastIndexOf(".") + 1,
inputFilename.length())) {
case "xls":
return readXLS(path);
case "xlsx":
return readXLSX(path);
default:
Log.e(TAG, "No XLS file chosen");
return "Please select valid \"Excel\" File\"";
}
对于XLSX文件:使用XSSFWorkbook & XSSFSheet
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File(path)));
XSSFSheet sheet = workbook.getSheetAt(0);
对于XLS文件:使用HSSFWorkbook & HSSFSheet
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(path)));
HSSFSheet sheet = workbook.getSheetAt(0);
答案 1 :(得分:5)
当您通过LibreOffice创建XLS / XLSX文件时,可能会发生这种情况。显然,转换中丢失了某些内容,该文件与Microsoft Office中生成的电子表格不同。我有同样的错误,我的解决方案是将我在LibreOffice Calc中完成的所有工作复制到MS Excel电子表格中,然后保存一个新文件。
答案 2 :(得分:2)
您所拥有的是Excel文件与您尝试创建的工作簿之间的版本不匹配。要避免的最佳方法是:选择接口实现。
我建立在Hitesh Sahu的解决方案之上:
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
Workbook workbook = null;
// parse files from request
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile multipartDataPointsFile = multipartRequest.getFile("yourFileHere");
try {
if(multipartDataPointsFile!=null) {
String originalFileName= multipartDataPointsFile.getOriginalFilename();
if(originalFileName!=null && originalFileName.length()>0) {
switch (originalFileName.substring(originalFileName.lastIndexOf(".") + 1,
originalFileName.length())) {
case "xls":
try {
workbook = WorkbookFactory.create(multipartDataPointsFile.getInputStream());
}catch(org.apache.poi.openxml4j.exceptions.InvalidFormatException ie){
logger.error("Malformed Excel");
throw new IOException();
}
if(workbook!=null) {
// Do something in here
}else{
logger.error("Could not pass along the workbook");
throw new IOException();
}
case "xlsx":
try {
workbook = WorkbookFactory.create(multipartDataPointsFile.getInputStream());
}catch(org.apache.poi.openxml4j.exceptions.InvalidFormatException ie){
logger.error("Malformed Excel");
throw new IOException();
}
if(workbook!=null) {
// Do something in here
}else{
logger.error("Could not pass along the workbook");
throw new IOException();
}
default:
logger.error("File type is not recognized Excell type");
throw new IOException();
}
}else{
logger.error("Can Not Read File Name");
throw new IOException();
}
}else{
logger.error("Did not select a file");
throw new IOException();
}
} catch (IOException e) {
throw new ApplicationErrorException("Can't parse Excel file");
}
答案 3 :(得分:0)
检查EXCEL格式....首先我用poi创建了一个示例excel,我改变了我的第一次尝试它给出了同样的错误,但是几次尝试它成功读取。我想知道为什么它没有先工作跑 :( 但如果您有正确的图书馆,请检查正确的Excel格式
答案 4 :(得分:0)
我遇到了同样的问题。你的excel格式不正确。您可以将所有工作复制到新工作表或执行清除格式。祝好运。
答案 5 :(得分:0)
我有同样的问题。当你打开excel文件时,它会生成一些文件,如〜$ ______。xlsx 只需查找并删除所有为我工作的内容。
答案 6 :(得分:0)
另一种可能的解决方案是
Workbook workbook = WorkbookFactory.create(source)
WorkbookFactory
应由您正在使用的Apache POI提供(如果不升级到更新版本)。它识别文件格式并创建Workbook
接口(XSSFWorkbook
或HSSFWorkbook
)的具体实现。 source
参数可以是java.io.InputStream
或java.io.File
。
答案 7 :(得分:0)
您的应用程序尝试访问的excel文件由于网络问题或格式损坏而没有响应导致此错误。如果是由于网络问题,请稍后尝试运行应用程序(或)如果文件已损坏,请尝试放置新文件并测试您的应用程序。祝你好运。
答案 8 :(得分:0)
在我的情况下,这就是我的想法,而第3行抛出了此异常:
File xlsxFile = new File( "C:\\myWorkbook.xlsx" );
FileInputStream finXLSX = new FileInputStream( xlsxFile ); //line1
FileOutputStream foutXLSX = new FileOutputStream( xlsxFile ); //line2
XSSFWorkbook workSheet = new XSSFWorkbook( finXLSX ); //line3
但是我发现第3行不起作用,因为我还打开了输出流 通过line2在我的xlsx文件上,然后执行line3失败。我删除了line2以使其正常工作。
答案 9 :(得分:0)
我遇到了类似的问题,最后发现文件具有敏感性->作为机密文件,将其更改为公开..解决了我的问题。 一切顺利
答案 10 :(得分:-1)
我的excel工作表已加密。删除密码即可。