导入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行数控制的少一些。
}
转载于:https://blog.51cto.com/sunyoung/737293