大家好,小弟最近在优化原来的构架,实现支持excel 2007文件的上传并将数据导入数据库,遇到的问题是struts1.2 中FormFile传过来的文件流好象PIO3.7的XSSFWorkbook好象不支持,直接抛异常~
action中写的方法是List read07Excel(Inputstream is){
...}然后通过JSP页面传过来的获取的文件流实现参数的传递FormFile.getInputstream()
问题在于如下一行:
workbook = new XSSFWorkbook(is);
XSSFWorkbook支持文件的路径和文件流,但是现在文件流传过来异常,那如何获取上传文件的路径?
本地写的main函数实现读取excel 2007是没有问题的,我想问题可能就在于struts 1.2的formFile获取的文件流和XSSFWorkbook的接口有问题?
谢谢高手帮忙,小弟就这些分数啦~

解决方案 »

  1.   

    如果POI支持的参数是InputStream , 应该没有问题
    贴一下异常信息看看
      

  2.   

    是呀,本地的测试用的main函数都没有问题~原来前后台都不抱任何错误,今天又修改了下,前台包如下的错误:
    HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception javax.servlet.ServletException: Servlet execution threw an exception
    com.icbc.util.PrivilegeFilter.doFilter(PrivilegeFilter.java:68)
    com.icbc.util.NoCacheFilter.doFilter(NoCacheFilter.java:37)
    com.icbc.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:28)
    root cause java.lang.NoClassDefFoundError: org/apache/poi/xssf/usermodel/XSSFWorkbook
    com.icbc.util.ReadExcel.read07Excel(ReadExcel.java:124)
    com.icbc.fpms.provide.action.CreditExcelImportAction.execute(CreditExcelImportAction.java:74)
    org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    com.icbc.util.PrivilegeFilter.doFilter(PrivilegeFilter.java:68)
    com.icbc.util.NoCacheFilter.doFilter(NoCacheFilter.java:37)
    com.icbc.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:28)
    源码:大致如下:
    private static List<Object> read2007Excel(InputStream file) throws IOException {
    List<Object> list = new ArrayList<Object>();
    // 构造 XSSFWorkbook 对象,strPath 传入文件路径
    XSSFWorkbook xwb = new XSSFWorkbook(file);
    // 读取第一章表格内容
    //XSSFSheet sheet = xwb.getSheetAt(0);
    Object value = null;
    XSSFRow row = null;
    XSSFCell cell = null;
    for (int numSheet = 0; numSheet < xwb.getNumberOfSheets(); numSheet++) {
    XSSFSheet sheet = xwb.getSheetAt(numSheet);
    if (sheet == null) {
    continue;
     }
    for (int i = sheet.getFirstRowNum(); i <= sheet.getPhysicalNumberOfRows(); i++) {
    row = sheet.getRow(i);
    if (row == null) {
    continue;
    }
    List<Object> linked = new ArrayList<Object>();
      for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
    cell = row.getCell(j);
    if (cell == null) {
    continue;
    }
    DecimalFormat df = new DecimalFormat("0");// 格式化 number String
    // // 字符
    SimpleDateFormat sdf = new SimpleDateFormat(
    "yyyy-MM-dd");// 格式化日期字符串
    DecimalFormat nf = new DecimalFormat("0.000000");// 格式化数字
    switch (cell.getCellType()) {
    case XSSFCell.CELL_TYPE_STRING:
    System.out.println(i + "行" + j + " 列 is String type");
    value = cell.getStringCellValue();
    break;
    case XSSFCell.CELL_TYPE_NUMERIC:
    System.out.println(i + "行" + j+ " 列 is Number type ; DateFormt:"+ cell.getCellStyle().getDataFormatString());
    if ("@".equals(cell.getCellStyle().getDataFormatString())) {
    value = df.format(cell.getNumericCellValue());
    } else if ("General".equals(cell.getCellStyle()
    .getDataFormatString())) {
    value = nf.format(cell.getNumericCellValue());
    } else {
    value = sdf.format(HSSFDateUtil.getJavaDate(cell
    .getNumericCellValue()));
    }
    break;
    case XSSFCell.CELL_TYPE_BOOLEAN:
    System.out.println(i + "行" + j + " 列 is Boolean type");
    value = cell.getBooleanCellValue();
    break;
    case XSSFCell.CELL_TYPE_BLANK:
    System.out.println(i + "行" + j + " 列 is Blank type");
    value = "";
    break;
    default:
    System.out.println(i + "行" + j + " 列 is default type");
    value = cell.toString();
    }
    //value = cell.toString();
    if (value == null || "".equals(value)) {
    continue;
    }
    linked.add(value);
    }
    list.add(linked);
    }
    }
    return list;
    }
      

  3.   

    Action调用的时候就直接read2007Excel(FormFile.getInputstream())然后就抛异常了~谢谢LZ~
      

  4.   

    也做过上传入库的操作,并为发现楼主所说异常
    java.lang.NoClassDefFoundError: org/apache/poi/xssf/usermodel/XSSFWorkbook楼主是不是没引入找个包,excel2007除了poi之外,还需要poi-ooxml-3.8-beta4-20110826.jar
    poi-ooxml-schemas-3.8-beta4-20110826.jar
    ooxml-lib\dom4j-1.6.1.jar
    ooxml-lib\xmlbeans-2.3.0.jar
    ooxml-lib\stax-api-1.0.1.jar
      

  5.   

    谢谢softroad的关注,问题找到了,是因为之前POI3.2的jar包存在,我虽然是remove,但是没有从LIB文件夹下删除,但是值打开一个POIjar包。谢谢这位的关心。