导入Excel如果是用Jxl可能会比较麻烦。因为Jxl只能处理2003版本的Excel,也就是未命名以xls结尾的Excel文件。 而处理未命名以xlsx结尾的也不是不可以,只是相对比较麻烦。

这里我就简单介绍一下导入这2个版本的Excel的方法。

     一开始我们要通过在Action里面判断:String fileName = uploadFileName.substring(uploadFileName.lastIndexOf('.') + 1,uploadFileName.length()); 截取文件名判断是“xls”,则调用上传2003的方法,若文件名是“xlsx”则调用上传2007的方法

导入2003:

        Workbook book = Workbook.getWorkbook(new FileInputStream(file));

上面代码: 通过页面Form表单直接浏览传过来file,并把file解析成workbook。

Sheet sheet = book.getSheet(0);         //获得第一个工作表对象

        Cell cell1 = sheet.getCell(0, 0); 
        Cell cell2 = sheet.getCell(1, 0);
        Cell cell3 = sheet.getCell(2, 0);
        String result1 = cell1.getContents();
        String result2 = cell2.getContents();
        String result3 = cell3.getContents();

上面代码: 获得第一列第一行,获得第二列第一行,获得第三列第一行。

        sheet.getRows();              //获得第一个工作表的行数

        for (int j = 0; j <sheet.getRows();j++) {
                  最后可以通过循环把读出来的数据在循环里insert进数据库。             
                }

导入2007:

       (一开始我们可以直接把我们的xlsx文件的格式改为rar。未命名,发现2007的Excel本身就是有很多个xml文件构成。)

        ZipFile xlsxFile = new ZipFile(file); // 解压
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        ZipEntry sharedStringXML = xlsxFile.getEntry("xl/sharedStrings.xml"); // 先读取sharedStrings.xml这个文件备用
        InputStream sharedStringXMLIS = xlsxFile.getInputStream(sharedStringXML);
        Document sharedString = (Document) dbf.newDocumentBuilder().parse(sharedStringXMLIS);
        NodeList str = ((org.w3c.dom.Document) sharedString).getElementsByTagName("t");
        String sharedStrings[] = new String[str.getLength()];
        for (int n = 0; n < str.getLength(); n++)
        {
            Element element = (Element) str.item(n);
            
            sharedStrings[n] = element.getTextContent();
        }

上面代码:通过页面Form表单直接浏览传过来file,并把file解压成xml文件。

        ZipEntry workbookXML = xlsxFile.getEntry("xl/workbook.xml");         // 找到解压文件夹里的workbook.xml,此文件中包含了这张工作表中有几个sheet
        InputStream workbookXMLIS = xlsxFile.getInputStream(workbookXML);
        Document doc = dbf.newDocumentBuilder().parse(workbookXMLIS);
        NodeList nl = doc.getElementsByTagName("sheet");  // 获取一共有几个sheet


            for (int i = 0; i < nl.getLength(); i++) {

                 Element element = (Element) nl.item(i);  // 将node转化为element,用来得到每个节点的属性

                 System.out.println(element.getAttribute("name"));  // 输出sheet节点的name属性的值

                                                                                                              // 接着就要到解压文件夹里找到对应的name值的xml文件,比如在workbook.xml中有 节点

                                                                                                              // 那么就可以在解压文件夹里的xl/worksheets下找到sheet1.xml,这个xml文件夹里就是包含的表格的内容

             ZipEntry sheetXML = xlsxFile.getEntry("xl/worksheets/" + element.getAttribute("name").toLowerCase() + ".xml");

             InputStream sheetXMLIS = xlsxFile.getInputStream(sheetXML);

             Document sheetdoc = dbf.newDocumentBuilder().parse(sheetXMLIS);

             NodeList rowdata = sheetdoc.getElementsByTagName("row");

             Map map = materialDao.getMaterialInfo(stockId);

                       for (int j = 0; j < rowdata.getLength(); j++) {

// 得到每个行

// 行的格式:

                     Element row = (Element) rowdata.item(j);

  // 根据行得到每个行中的列

                   NodeList columndata = row.getElementsByTagName("c");

                              for (int k = 0; k < columndata.getLength(); k++) {

                                       Element column = (Element) columndata.item(k);

                                             if(k == 0 && !("A"+String.valueOf(j+1)).equals(column.getAttribute("r"))) {

                                                       tip = "数据第一列不能有空值!";

                                                        return tip; }

                                            if(k == 1 && !("B"+String.valueOf(j+1)).equals(column.getAttribute("r"))) {

                                                       tip = "数据第二列不能有空值!";

                                                        return tip; }

上面代码判断第一列和第二列是否有空值。如果有空值直接return跳出。

                                    NodeList values = column.getElementsByTagName("v");

                                    Element value = (Element) values.item(0);

                                      if (column.getAttribute("t") != null & column.getAttribute("t").equals("s")) {

                                              // 如果是共享字符串则在sharedstring.xml里查找该列的值

                                              System.out.print(sharedStrings[Integer.parseInt(value.getTextContent())] + " ");

                                              list1.add(sharedStrings[Integer.parseInt(value.getTextContent())] + " "); }

                                    else {

                                              System.out.print(value.getTextContent() + " ");

                                              list1.add(value.getTextContent() + " "); } } }

上面代码就是循环整个表里面的值。并把它放在list1这个集合里面。这里注意它是按行来读取数据的,就是说它先把第一行读取,读取完继续读取第二行,然后在读取第三行。

                             for(int q = 3; q<list1.size(); q=q+3){

                                   由for循环来遍历刚才解析出来的数据。int q=3;说明第一行有3列。是标题列。那不是数据我们直接从第二行开始读取数据。

                                     然后直接在for循环里面直接把刚才读取的那一行的数据insert进数据库。这里只能这么操作,如果Excel行数过多。可能循环插入 循环插入很浪费内存。所以尽量把Excel行数控制的少一些。

                                   }