读书人

poi读取Excel文件报错误

发布时间: 2012-03-21 13:33:14 作者: rapoo

poi读取Excel文件报异常
最近使用poi操作Excel时,在读取Excel到文件到文件流中时,抛出一下异常:
org.apache.poi.hssf.record.RecordFormatException: String record was supplied but formula record flag is not set
at org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate.<init>(FormulaRecordAggregate.java:51)
at org.apache.poi.hssf.record.aggregates.ValueRecordsAggregate.construct(ValueRecordsAggregate.java:159)
at org.apache.poi.hssf.record.aggregates.RowRecordsAggregate.<init>(RowRecordsAggregate.java:89)
at org.apache.poi.hssf.model.Sheet.createSheet(Sheet.java:219)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:281)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:196)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:313)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:294)
at com.nec.nes.eks.importEmployeeAttendance.service.ImportEmployeeAttendanceService.getEmployeeAttendanceFromXls(ImportEmployeeAttendanceService.java:164)
at com.nec.nes.eks.importEmployeeAttendance.action.ImportEmployeeAttendanceAction.uploadAnalyzeFile(ImportEmployeeAttendanceAction.java:167)
at com.nec.nes.eks.importEmployeeAttendance.action.ImportEmployeeAttendanceAction.exe(ImportEmployeeAttendanceAction.java:86)
at com.nec.nes.comn.core.action.BaseAction.execute(BaseAction.java:79)
at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
at com.nec.nes.comn.core.servlet.OurActionServlet.service(OurActionServlet.java:96)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)


at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Unknown Source)
--------------------------------------------------------------------------
在网上搜了很长时间,没有找到正确答案,通过自己实践,找出原因。
在用poi读取Excel时,应保证Excel文件默认选中的是第一个sheet页,即异常中的提示:String record was supplied but formula record flag is not set

[解决办法]
找到原因,解决问题了么?
[解决办法]

Java code
// 最近写的。你参考下,不理解再问package se.analyzer.parser.impl;import java.io.File;import java.io.FileInputStream;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import se.analyzer.parser.Parsable;import se.analyzer.parser.Parser;public class ExcelParser extends Parser implements Parsable {    @Override    public String getContext(File arg) {        StringBuffer context = new StringBuffer();        try {            // 创建对Excel工作簿文件的引用            HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(arg));            // 获取sheet数            int iSheetNum = workbook.getNumberOfSheets();            for (int numSheets = 0; numSheets < iSheetNum; numSheets++) {                if (null != workbook.getSheetAt(numSheets)) {                    // 获得一个sheet                    HSSFSheet aSheet = workbook.getSheetAt(numSheets);                    int iRowNum = aSheet.getLastRowNum();                    for (int rowNumOfSheet = 0; rowNumOfSheet <= iRowNum; rowNumOfSheet++) {                        if (null != aSheet.getRow(rowNumOfSheet)) {                            HSSFRow aRow = aSheet.getRow(rowNumOfSheet);                            int iCellNum = aRow.getLastCellNum();                            for (int cellNumOfRow = 0; cellNumOfRow < iCellNum; cellNumOfRow++) {                                if (null != aRow.getCell(cellNumOfRow)) {                                    HSSFCell aCell = aRow.getCell(cellNumOfRow);                                    int cellType = aCell.getCellType();                                    switch (cellType) {                                    case 0:// Numeric                                        double sCell = aCell                                                .getNumericCellValue();                                        context.append(sCell);                                        break;                                    case 1:// String                                        String strCell2 = aCell                                                .getStringCellValue();                                        context.append(strCell2);                                        break;                                    default:                                        // other data                                        String strCell3 = aCell                                                .getStringCellValue();                                        context.append(strCell3);                                        break;                                    }                                }                                context.append(" ");                            }                        }                        context.append("\n");                    }                }                context.append("\n");            }        } catch (Exception e) {            e.printStackTrace();        }        return context.toString();    }} 

读书人网 >Java相关

热点推荐