如何解析xmlpoi基础类对poi xml文件导出解析入库

没有更多推荐了,
不良信息举报
举报内容:
使用Java的POI进行Word文档的解析并生成XML格式文档
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!问题描述:在使用poi包进行excel解析时,发现对Excel2003以前(包括2003)的版本没有问题,但读取Excel2007时发生如下异常: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)。
原因分析:XSSF不能读取Excel2003以前(包括2003)的版本,如果遇到2007版本的Excel文件就需要在读取前判断文件是2003前的版本还是2007的版本,然后对应调用HSSF或XSSF来读取。
解决方式:目前只能通过后缀名来判断文件版本,代码如下:(如果有高手知道别的解决方法,请告知,谢谢!)
1 public static boolean isExcel2003(String filePath)
return filePath.matches("^.+\\.(?i)(xls)$");
获得版本号之后,根据版本号的不同创建不同的对象,代码如下:
1 /** 根据版本选择创建Workbook的方式 */
3 Workbook wb = null;
5 if (isExcel2003)
wb = new HSSFWorkbook(inputStream);
wb = new XSSFWorkbook(inputStream);
阅读(...) 评论()博客分类:
poi getCellType类型说明
CellType 类型 值
CELL_TYPE_NUMERIC 数值型 0
CELL_TYPE_STRING 字符串型 1
CELL_TYPE_FORMULA 公式型 2
CELL_TYPE_BLANK 空值 3
CELL_TYPE_BOOLEAN 布尔型 4
CELL_TYPE_ERROR 错误 5
excel文件后缀
.xls& 2003版
XLSX& 2007版
excel采用HTTP协议传输的。
Spring MVC中上传文件,将文件转换为输入流
MultipartHttpServletRequest multipartRequest =(MultipartHttpServletRequest)
//SpringMVC上传文件的控件
//提取;文件,这个参数必须和上传控件的name一致。返回上传内容对象,如果不存在就返回null.
MultipartFile multipartFile = multipartRequest.getFile("file");
InputStream in = multipartFile.getInputStream();//获取控件内容的输入流
将得到的文件输入流,解析为一个字符串中
//针对2003版本
//创建excel2003的文件文本抽取对象
Workbook wb = new HSSFWorkbook(new POIFSFileSystem(in));
//声明相关的excel抽取对象
ExcelExtractor extractor = new ExcelExtractor((HSSFWorkbook) wb);
String a = extractor.getText();//保存了excel文件中多有的内容字符串
//针对2007版本
//创建excel2007的文件文本抽取对象
Workbook wb = new XSSFWorkbook(in);
//声明相关的excel抽取对象
XSSFExcelExtractor extractor =& new XSSFExcelExtractor((XSSFWorkbook) wb);
String a = extractor.getText();
----------------------------------------------------------------
POI读写2007+的excel时
Exception in thread "main" org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
at org.apache.poi.xssf.usermodel.XSSFFactory.createDocumentPart(XSSFFactory.java:62)
错误原因:
xbean的jar包有冲突,删除xbean的包引用POI里的xmlbeans-2.3.0,可正确读取
我也遇到了同样的问题.
如果操作xls文件的时候没有问题, 当操作xlsx文件的时候就会报这个错.
我的问题已经解决了.
原因: 主要是因为xls和xlsx的解析方式不一样, 导致使用的类不同.
xls返回的是HSSFWorkbook&& , 而xlsx返回的是XSSFWorkbook.
我自己试验了一种方法是:
HSSFW
try {
&&&& book = new HSSFWorkbook(in);
} catch (Exception ex) {
&&&& book = new XSSFWorkbook(in);
}
其结果不尽人意, 而且报错莫名其妙.(反正我是没搞懂).
进入正题: 以下方法是正解,
1. 新建个方法, 返回HSSFWorkbook和XSSFWorkbook所实现的接口
文件的前8个字节,然后根据这个判断
用读取文件头的方法,07有规律,文件头是"PK";但是03的话 一直不知道~
public Workbook create(InputStream inp) throws IOException, InvalidFormatException {
if (!inp.markSupported()) {
inp = new PushbackInputStream(inp,;
if (POIFSFileSystem.hasPOIFSHeader(inp)) {
log.error("2003及以下");
return new HSSFWorkbook(inp);
if (POIXMLDocument.hasOOXMLHeader(inp)) {
log.error("2007及以上");
return new XSSFWorkbook(OPCPackage.open(inp));
log.error("你的excel版本目前poi解析不了");
2.在new Workbook对象的时候直接调用该静态方法去构造.
Workbook book = create(in);
3. 切记, 如果workbook使用了接口的话, 那么Sheet也一定要用接口, 不要用实现类了.
Sheet sheet = book.getSheetAt(0);
* @(#)demo02
* @(#)demo.java
* Copyright (C) , All rights reserved.
* iSoftStone Information Technology ( Group ) Co., Ltd.
package demo02;
* &P&Description: TODO&/P&
* @ClassName: demo
* @author zhangmeijia
下午02:50:54
* @see TODO
public class demo {
//&p&Description: 解析Excel文件&/p&
public List&User& readExcel(final String fileName, HttpServletRequest req) throws Exception {
List&User& UserList =
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)
MultipartFile multipartFile = multipartRequest.getFile("file");
InputStream in = multipartFile.getInputStream();
Workbook wb =//声明工作薄
wb = create(in);
String hz = fileName.substring(fileName.lastIndexOf('.'), fileName.length()).toUpperCase();
if (".XLS".equals(hz)) {
wb = new HSSFWorkbook(new POIFSFileSystem(in));
wb = new XSSFWorkbook(in);
//解析Excel文件内容,将其封装为实体集合,返回集合
UserList = analysis(wb);
return UserL
public Workbook create(InputStream inp) throws Exception {
if (!inp.markSupported()) {
inp = new PushbackInputStream(inp, 8);
if (POIFSFileSystem.hasPOIFSHeader(inp)) {
log.error("2003及以下");
return new HSSFWorkbook(inp);
if (POIXMLDocument.hasOOXMLHeader(inp)) {
log.error("2007及以上");
return new XSSFWorkbook(OPCPackage.open(inp));
log.error("你的excel版本目前poi解析不了");
* &p&Description: 解析。遍历所有数据&/p&
public List&User& analysis(Workbook wb) throws Exception {
List&User& UserList = new ArrayList&User&();
for (int k = 0; k & wb.getNumberOfSheets(); k++) {// 遍历每一个Sheet
Sheet sheet = wb.getSheetAt(k);
int rows = sheet.getPhysicalNumberOfRows();
List&String& list = new ArrayList&String&();
for (int r = 0; r & r++) {//遍历每一行
if (r == 0) {
Row row = sheet.getRow(r);
if (row == null) {
int cells = row.getPhysicalNumberOfCells() + 1;// 每一行单元格数目
//1.解析一行数据为一个字符串
String str = analysisOneLineTdList(cells, row);
list.add(str);
//2.将数据字符串的集合,生成实体对象放入集合,并返回
List&User& cusInfoList = getUserList(list);
for (User c : cusInfoList) {
UserList.add(c);
} catch (Exception e) {
log.error("Excel文件导入,analysis方法失败");
e.printStackTrace();
throw new Exception();
return UserL
* &p&Description: 解析每一行&/p&
public String analysisOneLineTdList(int cells, Row row) throws Exception {
String lineStr = "";
String str = "";
for (short c = 0; c & c++) {
Cell cell = row.getCell(c);
if (cell == null) {
switch (cell.getCellType()) {// 单元格的类型
case Cell.CELL_TYPE_FORMULA:// 公式型
str = cell.getNumericCellValue() + "";
case Cell.CELL_TYPE_NUMERIC:// 数值型
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
str = sdf.format(date).toString();
BigDecimal num = new BigDecimal(cell.getNumericCellValue());
str = String.valueOf(num);
case Cell.CELL_TYPE_STRING:// 字符串型
str = cell.getRichStringCellValue().toString().replaceAll("'", "''");
case Cell.CELL_TYPE_BOOLEAN:// 布尔型
str = cell.getBooleanCellValue() + "";
case Cell.CELL_TYPE_BLANK:// 空值
case Cell.CELL_TYPE_ERROR:// 错误
lineStr = lineStr + "
} catch (Exception e) {
log.error("Excel文件导入,解析一行analysisOneLineTdList方法失败");
e.printStackTrace();
throw new Exception();
lineStr = lineStr.replaceFirst("
return lineS// 以字符串返回该行的数据
* &p&Description: 获取封装实体的集合&/p&
public List&User& getUserList(List&String& list) throws Exception {
List&User& UserList = new ArrayList&User&();
for (int r = 0; r & list.size(); r++) {
String rowsStr = list.get(r);
String[] td = rowsStr.split("
//数据限制
User ci = new User();
ci.setSerialNumber(td[0].trim());
ci.setOrderNo(td[1].trim());
ci.setProductCode(td[2].trim());
ci.setProductName(td[3].trim());
ci.setCustomerName(td[4].trim());
} catch (ParseException e) {
log.error("Excel文件导入,解析日期getUserList方法失败");
e.printStackTrace();
throw new Exception();
UserList.add(ci);
return UserL
苏坡曼你妹
浏览: 11233 次
workbook里面的属性都有哪些?
为什么这么麻烦,直接当成普通文件读取出来,不行吗,反正你只是想 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'没有更多推荐了,
不良信息举报
举报内容:
在VS2010中利用百度地图Place API获取POI数据(XML文件方式存储),并导入mysql数据库
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!如何解析xmlpoi基础类对文件解析入库-网问答
&&&&&&如何解析xmlpoi基础类对文件解析入库
如何解析xmlpoi基础类对文件解析入库
如何解析xmlpoi基础类对文件解析入库
这个难度不大,用java配合现在已有的外部扩展库很容易做到,你搜一下sax和poi,前者sax是解析xml的(还有dom4j等工具也可以解析),后者poi是解析word的(excel,ppt也可以解析)转换后格式怎么样看你自己设计了。我以前肠畅斑堆职瞪办缺暴画写过一个解析word,ppt,excel翻译带格式文本的工具,经常用xml存数据。但还真没把他们做到一起来回转换,感觉意义不大,没啥用。
回答者:热心网友 时间: 10:13:47
本类最有帮助
网问答为提供知识和解答各类疑难的平台,目标是做到有问必答解决您遇到的各类问题.本站内容均为网友发表,并不代表本站立场!
Copyright &
www.wangwenda.com All rights reserved.冀ICP备号-1 投诉邮箱:

我要回帖

更多关于 poixmldocument 的文章

 

随机推荐