poi excel 03と07の互換性のない問題を解決する
4352 ワード
new HSSFWorkbook(new FileInputStream)を使用してWorkbookを読み取り始めたばかりで、Excel 2003以前(2003含む)のバージョンでは問題ありませんでしたが、Excel 2007を読み込むと、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 OLE 2 Office Documents.You need to call a different part of POI to process this data(eg XSSF instead of HSSF)このエラーは、ファイル中のデータはOffice 2007+XMLで保存されているが、現在はOLE 2 Officeドキュメント処理を呼び出しており、POIの異なる部分を使用してこれらのデータを処理すべきであり、例えばXSSFを使用してHSSFの代わりに処理すべきであることを意味する.そこでヒントを押してHSSFの代わりにXSSFを使い、new XSSFWORkbook(excelFile)でWorkbookを読み取り、Excel 2007には問題なく、しかしExcel 2003を読み込む前に(2003を含む)のバージョンでは、org.apache.poi.openxml 4 j.exceptions.InvalidOperationException:Can't open the specified file:'*.xls'という新しい異常が発生しました.このエラーは、操作が無効で、指定したxlsファイルを開くことができません.POIのソースコードをダウンロードして単一ステップでデバッグしたところ、最初は正しいことがわかりましたが、ZipFまでileクラスになるとファイルが見つからず、ネットで調べてみると、XSSFがExcel 2003を読み込めない以前(2003を含む)のバージョンですが、これでは、読み込む前にファイルが2003前のバージョンなのか2007のバージョンなのかを判断し、それに対応してHSSFやXSSFを呼び出して読み取る必要があります.これは初歩的な考え方ですが、このやり方は面倒なので、APIを見てみると、XSSFとHSSFは別のパッケージに入っているものの、同じインタフェースWorkbookを引用していることに気づき、こう思いました読み込み方法:Workbook book=null; try { book = new XSSFWorkbook(excelFile); } catch (Exception ex) { book = new HSSFWorkbook(new FileInputStream(excelFile)); }各バージョンのExcelでテストし、異常は発生せず、問題解決.
他のネットユーザーのソリューションも提供します.
エクセルバージョンを異常で判断するならorgを使うと思います.apache.poi.poifs.filesystem.OfficeXmlFileExceptionこの異常が良い
私がnew HSSFWorkbookでnew 2007の会報のこの間違いは直接Exceptionを使うのは少し漠然としているでしょうorgを知っていますから.apache.poi.hssf.OldExcelFormatExceptionの間違いこれはEcxel 5を作ることです.0/95の間違いこれはXSSFでも処理できません
自分で処理したコードの部分:
他のネットユーザーのソリューションも提供します.
//
in = new FileInputStream(excelFile);
//
Workbook wb =null;
// excel
ExcelExtractor extractor=null;
String fileName = excelFile.getName();
String hz = fileName.substring(fileName.lastIndexOf("."),fileName.length());
if(hz.equals(".xls"))// 2003
{
// excel2003
wb=new HSSFWorkbook(new POIFSFileSystem(in));
extractor =new org.apache.poi.hssf.extractor.ExcelExtractor((HSSFWorkbook)wb);
}else{ // 2007
wb = new XSSFWorkbook(in);
// excel2007
extractor =new XSSFExcelExtractor((XSSFWorkbook)wb);
}
推奨事項:エクセルバージョンを異常で判断するならorgを使うと思います.apache.poi.poifs.filesystem.OfficeXmlFileExceptionこの異常が良い
私がnew HSSFWorkbookでnew 2007の会報のこの間違いは直接Exceptionを使うのは少し漠然としているでしょうorgを知っていますから.apache.poi.hssf.OldExcelFormatExceptionの間違いこれはEcxel 5を作ることです.0/95の間違いこれはXSSFでも処理できません
自分で処理したコードの部分:
/**
* @description
* @param filename
* @return
* @throws Exception
* @throws TException
*/
@RequestMapping(value = "/uploadWfdl", method = RequestMethod.POST, produces = {"application/text;charset=UTF-8"})
@ResponseBody
public String importData(@RequestParam("filename") MultipartFile filename,
HttpServletRequest request,
HttpServletResponse response
) throws TException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
InputStream inputStream = null;
try {
inputStream = filename.getInputStream(); //
} catch (IOException e) {
logger.info("importData------------------------>InputStream IOException");
}
Workbook workbook = null;
try {
workbook = new XSSFWorkbook(inputStream); // 2007
} catch (Exception ex) {
logger.info("importData------------------------>XSSFWorkbook Read InputStream Exception");
try {
POIFSFileSystem pfs = new POIFSFileSystem(filename.getInputStream()); // 2003
workbook = new HSSFWorkbook(pfs);
} catch (IOException e) {
logger.info("importData------------------------>HSSFWorkbook Read InputStream Exception");
}
}
Sheet hssfSheet = workbook .getSheetAt(0);
int rowCount = hssfSheet.getPhysicalNumberOfRows(); //
String msg = "";
if(hssfSheet!=null) {
for (int i = 1; i<= rowCount; i++) {
Row excelData = hssfSheet.getRow(i);
if (excelData == null)
continue;
}
}
}