zoukankan      html  css  js  c++  java
  • jspsmart(保存文件)+poi(读取excel文件)操作excel文件

    写在前面:

      项目环境:jdk1.4+weblogic

      需求:能上传excel2003+2007

      由于项目不仅需要上传excel2003,还要上传excel2007,故我们抛弃了jxl(只能上传excel2003),选择了poi,在选poi的jar包的版本的时候,是真心的不容易呀,连找个jar都找了一两天,因为不仅要支持jdk1.4(丫丫的,无fuck说),还要能读取excel2007的。最后还是在csdn上花了6积分下载的....jar包(貌似只有这个才是支持jdk1.4的):dom4j-1.6.1.jar,geronimo-stax-api_1.0_spec-1.0.jar,ooxml-schemas-1.0.jar,poi-3.7-jdk1.4-20110508-rc2.jar,poi-3.7-jdk1.4-ooxml-20110508-rc2.jar,poi-3.7-jdk1.4-scratchpad-20110508-rc2.jar,xbean.jar,xmlbeans-qname.jar 然后如果我们要从服务器上读取excel文件的话 ,我们首先要上传文件到服务器,这里有很多方法,为了方便,保留了项目中jspsmart的上传文件的方法,很好用,因为excel2003跟2007都可以上传啦。故全部的jar包如图:

    功能:在index.jsp点击上传excel文件,文件上传到服务器,然后并在index2.jsp页面中显示出excel文件中内容 

    1.导入jar包(poi+jspsmart)

    2.编写index.jsp

    3.编写index2.jsp,代码如图(这是在jsp中的代码):

    注意注意在jsp中一定要导入用到的相关类的class路径

      <body>
      <%
                  //利用jspsmart将文件上传到服务器
                  SmartUpload su = new SmartUpload();
                su.initialize(pageContext);
                su.setMaxFileSize(200000); //2m
                su.setTotalMaxFileSize(200000);
                //设置允许上传的文件类型
                su.setAllowedFilesList("xls,txt,xlsx");//    allow upload
                su.upload();
                //获取上传的文件的名
                com.jspsmart.upload.File myFile = su.getFiles().getFile(0);
                String my_file_name = myFile.getFileName();
                boolean go_update = true;
                if (go_update) {
                //将文件上传到项目的excelupload文件夹下 这里注意要现在项目根创建这个文件
                    if(my_file_name.endsWith(".xls")){
                        //excel2003 后缀名.xls
                        myFile.saveAs("/excelupload/" + my_file_name);
                    }else if(my_file_name.endsWith(".xlsx")){
                        //excel2007 后缀名.xlsx
                        myFile.saveAs("/excelupload/" + my_file_name);
                    }
                    
                    }
                
                //利用poi 读取内容
                Workbook workbook = null;
                Sheet sheet = null;
                try {
                
                    String filePath = application.getRealPath("/") + "\excelupload\" + my_file_name;
                    FileInputStream fis = new FileInputStream(filePath);
                    
                    //做判断
                    if(my_file_name.endsWith(".xls")){
                        workbook = new HSSFWorkbook(fis);
                    }else if(my_file_name.endsWith(".xlsx")){
                        workbook = new XSSFWorkbook(fis);
                    }
                    
                    sheet = workbook.getSheetAt(0);
                    //excel中行数
                    int rowCount = sheet.getLastRowNum() + 1;
                    int columnCount;
                    //out.println("rowCount:==="+rowCount);
                    
                    for(int i=0;i<rowCount;i++){
                        Row row = sheet.getRow(i);
                        //每行中的列数
                        columnCount = row.getLastCellNum();
                        //out.println("columnCount:==="+columnCount);
                %>
                <br>
                <%         
                        //在页面中遍历打印出excel每一行的内容
                        for(int j=0;j<columnCount;j++){
                            Cell cell = row.getCell(j);    
                            //这里读取cell中内容时,要对内容进行转换为对应的类型,故这里封装了一个类,专门用来转换类型
                            out.print(FormatUtil.getCellStringValue(cell)+"
    
    ");
                        }
                %>
                <br>
                <% 
                    }
          } catch (Exception e) {
            out.println(e);
        }
       %>
      </body>

    3.index2.jsp中用到了一个类型转换类FormatUtil中getCellStringValue()方法(自己写的,放在单独的类中),如下图:

    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.ss.usermodel.Cell;
    
    public class FormatUtil {
    
        public static String getCellStringValue(Cell cell) {
             String cellValue = "";
             switch (cell.getCellType()) {
                 //字符串
                 case HSSFCell.CELL_TYPE_STRING:
                     cellValue = cell.getStringCellValue();
                     if(cellValue.trim().equals("")||cellValue.trim().length()<=0)
                         cellValue=" ";
                     break;
                //日期格式   数字     
                 case HSSFCell.CELL_TYPE_NUMERIC:
                     if(HSSFDateUtil.isCellDateFormatted(cell)){
                         Date d = cell.getDateCellValue();
                         DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                         cellValue = df.format(d);
                     }else{
                         cellValue = String.valueOf(cell.getNumericCellValue());     
                     }
                     
                     break;
                     //公式
                 case HSSFCell.CELL_TYPE_FORMULA:
                     cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                     cellValue = String.valueOf(cell.getNumericCellValue());
                     break;
                     //空值
                 case HSSFCell.CELL_TYPE_BLANK:
                     cellValue="";
                     break;
                     //boolean
                 case HSSFCell.CELL_TYPE_BOOLEAN:
                     cellValue = cell.getBooleanCellValue() + "";
                     break;
                     //故障
                 case HSSFCell.CELL_TYPE_ERROR:
                     cellValue = "非法字符";
                     break;
                 
                 default:
                     cellValue = "未知类型";
                     break;
             }
             
            return cellValue;
        }
    }

    4.运行项目,选择excel,可以看到效果如下:

    成功啦........嘻嘻。。。。

    5.查看服务器上传文件的文件夹,里面多了自己刚上传的文件:

    项目中jar包冲突问题(快速定位jar包加载路径):

      虽然在本地运行是可以的,但是其实也是走了很多路,因为当我把项目放在测试服务器weblogic上面跑的时候,就一直在报错,报错内容如

    其中的内容就是说 found:org.apache.poi.hssf.usermodel.HSSFWorkbook    required:org.apache.poi.ss.usermodel.Workbook

    workbook = new HSSFWorkbook(fis); 即找不到Workbook,可是我的jsp明明已经导入了Workbook的calss的相关路径啊,再说了在本地跑的时候也是正确的,这是为什么呢?唯一的原因就是jar包冲突了,因为服务器上有很多jar包,但是现在不知道是哪一个jar包冲突怎么办???啊,在网上查阅了一天的资料,终于 找到了一个办法来测试是什么jar包冲突的,代码如下:

            //Workbook与HSSFWorkbook类所在哦jar应该是一样的
            //打印出poi的核心jar的路径
            //打印出org.apache.poi.ss.usermodel.Workbook类所在jar包的路径
            ClassLoader classloader = org.apache.poi.ss.usermodel.Workbook.class.getClassLoader();
            java.net.URL res = classloader.getResource("org/apache/poi/ss/usermodel/Workbook.class");
            String path = res.getPath();
            System.out.println("POI Core came from "+ path);
            //library-1.0I20080604_tomcat63955.jar
            
            //打印出org.apache.poi.hssf.usermodel.HSSFWorkbook类所在jar包路径
            classloader = org.apache.poi.hssf.usermodel.HSSFWorkbook.class.getClassLoader();
            res = classloader.getResource("org/apache/poi/hssf/usermodel/HSSFWorkbook.class");
            path = res.getPath();
            System.out.println("POIOOXML came from" + path);
            //poi-3.7-jdk1.4-ooxml-20110508-rc263962.jar!

    运行代码明显可以看出项目中加载的Wookbook类的jar是library-1.0I20080604_tomcat63955.jar,这是什么鬼,我去lib下查看,果然有这个jar包存在,mmp,终于找到了,删掉它,再次运行打印出Wookbook类的核心jar包,此次的正确 ,是我自己导入的poi的jar包。哈哈哈.....坚持,坚持,再坚持,总会成功的,耶耶耶。。。。。。。

    总结:这里虽然使用的是支持jdk1.4的poi,但其实其他版本的poi的用法都相同,只不过导入的jar不同而已,开心把问题解决了。

    交流群:527038646  嘻嘻嘻

  • 相关阅读:
    最短路-dij
    链式前向星
    B树、B+树
    C++类
    差分约束
    数位DP
    Markdown编辑器:表格
    git使用笔记
    leetcode 162. 寻找峰值(二分)
    python matplotlib包的安装注意事项:报错——No such file or dir : tmp/matplotlib-xxxxxx
  • 原文地址:https://www.cnblogs.com/eleven258/p/7424168.html
Copyright © 2011-2022 走看看