Poi对Excel文件的导入导出

  • 在公司做Demo的时候需要对表格数据进行导出,那么首先就考虑主流的POI框架对数据进行导入导出。

一.Apache POI简介

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

二.POI结构

HSSF - 提供读写Microsoft Excel XLS格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF - 提供读写Microsoft Word DOC格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读Microsoft Visio格式档案的功能。
HPBF - 提供读Microsoft Publisher格式档案的功能。
HSMF - 提供读Microsoft Outlook格式档案的功能。

三.参考Demo

结合项目要求,需要对数据导出到Excel表格,所以在项目中使用到是HSSF的POI,首先是数据的导出,需要用的Jar在文章后面给出,也可以自己到Apache的大本营下载POI的jar包:http://poi.apache.org/,本文中使用到的POI版本是poi-3.9-20121203.jar

  • 首先我们需要在页面中提供出一个导出按钮,代码如下
<input type="button" value="导出" class="x-button" onclick="exportout();">
  • 我们在JS代码中指定导出按钮所执行的事件
function exportout() {
    var tablecmp = Ext.getCmp("jtable");
var arr = tablecmp.getAllTitle();// 获取表格所有的标题,为Excel的表格的表头做准备
    var title = new Array(arr.length - 2);// 规定表格默认第一行为序号(递增的序号),最后一行为操作,所以不需要传到表格作为表头
    title[0] = "ID";// 设置表格的表头第一列默认为ID值(数据库的主键ID)
    for (i = 1; i < title.length; i++) {
        title[i] = arr[i + 1];// 动态设置表头
    }
    window.location.href = "/Demo/servlet/Export?title=" + title;
}

注意:js代码中的数组传入Servlet后字符与字符之间是以”,”进行分割

  • Servlet中所处理事件代码
package com.servlet;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.model.C_RES_R_TEST;
import com.tools.DbTools;
import com.tools.ExportExcel;

public class ExportServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }


    @Override
    public void doPost(HttpServletRequest request,  HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("octets/stream");
        response.addHeader("Content-Disposition","attachment;filena me=export.xls");
        String title = request.getParameter("title") + ",";//获取表格的表头标题,加一个,是为了防止丢失最后一个没有,结尾的字符串

        String[] headers = null;
        if (title != null && !"".equals(title.trim())) {//按,对字符串进行分割
            headers = title.split(",");
        }

        ExportExcel<C_RES_R_TEST> ex = new ExportExcel<C_RES_R_TEST>();
        List<C_RES_R_TEST> dataset = new ArrayList<C_RES_R_TEST>();
        dataset = DbTools.getAllObject();
        OutputStream out = response.getOutputStream();

        ex.exportExcel(headers, dataset, out);
        out.close();

        System.out.println("excel导出成功!");
    }
}

注意:如果使用Servlet需要在web.xml文件中对Servlet进行注册,或者使用@WebServlet(“/servlet/Export “) 注释对Servlet进行配置注册,但是需要注意只有Servlet3.0以上的版本才支持注解配置(Tomcat6.0使用的Servlet2.5版本,Tomcat7.0使用的Servlet3.0版本,你也可以找到Tomcat的安装目录下/common/lib的servlet-api.jar(各版本所在路径不一样),解压找到MANIFEST.MF文件打开后找到Specification-Version: 2.4,那么2.4则为当前的Servlet的版本)。下面给出我的web.xml配置中的代码

<servlet>
        <servlet-name>Export</servlet-name>
        <servlet-class>com.servlet.ExportServlet</servlet-class>
    </servlet>
<servlet-mapping>
    <servlet-name>Export</servlet-name>
    <url-pattern>/servlet/Export</url-pattern>
</servlet-mapping>
  • 导出通用类ExportExcel的源码
package com.tools;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

/**
 * 利用开源组件POI动态导出EXCEL文档 应用泛型,代表任意一个符合javabean风格的类
 * 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx() byte[]表jpg格式的图片数据
 */
public class ExportExcel<T> {

    public void exportExcel(Collection<T> dataset, OutputStream out) {
        exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy/MM/dd HH:mm:ss");
    }

    public void exportExcel(String[] headers, Collection<T> dataset,
            OutputStream out) {
        exportExcel("测试POI导出EXCEL文档", headers, dataset, out,
                "yyyy/MM/dd HH:mm:ss");
    }

    public void exportExcel(String[] headers, Collection<T> dataset,
            OutputStream out, String pattern) {
        exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);
    }

    /**
     * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
     * 
     * @param title
     *            表格标题名
     * @param headers
     *            表格属性列名数组
     * @param dataset
     *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
     *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
     * @param out
     *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
     * @param pattern
     *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
     */
    @SuppressWarnings("unchecked")
    public void exportExcel(String title, String[] headers,
            Collection<T> dataset, OutputStream out, String pattern) {
        // 声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet(title);
        // 设置表格默认列宽度为15个字节
        sheet.setDefaultColumnWidth(15);
        // 生成一个格式化工具
        HSSFDataFormat format = workbook.createDataFormat();
        // 生成一个样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置这些样式
        style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 生成一个字体
        HSSFFont font = workbook.createFont();
        font.setColor(HSSFColor.VIOLET.index);
        font.setFontHeightInPoints((short) 12);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 把字体应用到当前的样式
        style.setFont(font);
        // 生成并设置另一个样式
        HSSFCellStyle style2 = workbook.createCellStyle();
        style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
        style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 生成另一个字体
        HSSFFont font2 = workbook.createFont();
        font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
        // 把字体应用到当前的样式
        style2.setFont(font2);

        // 声明一个画图的顶级管理器
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
        // 定义注释的大小和位置,详见文档
        HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,
                0, 0, 0, (short) 4, 2, (short) 6, 5));
        // 设置注释内容
        comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
        // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
        comment.setAuthor("lqs");

        // 产生表格标题行
        HSSFRow row = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell(i);
            cell.setCellStyle(style);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text);
        }

        // 遍历集合数据,产生数据行
        Iterator<T> it = dataset.iterator();
        int index = 0;
        while (it.hasNext()) {
            index++;
            row = sheet.createRow(index);
            T t = (T) it.next();
            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
            Field[] fields = t.getClass().getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                HSSFCell cell = row.createCell(i);
                Field field = fields[i];
                String fieldName = field.getName();
                String getMethodName = "get"
                        + fieldName.substring(0, 1).toUpperCase()
                        + fieldName.substring(1);
                try {
                    @SuppressWarnings("rawtypes")
                    Class tCls = t.getClass();
                    Method getMethod = tCls.getMethod(getMethodName,
                            new Class[] {});
                    Object value = getMethod.invoke(t, new Object[] {});
                    // 判断值的类型后进行强制类型转换
                    String textValue = null;
                    if (value instanceof Integer) {//Integer
                        int intValue = (Integer) value;
                        cell.setCellValue(intValue);
                    } else if (value instanceof Float) {//Float
                        float fValue = (Float)value;
                        style2.setDataFormat(format.getFormat("0.00")); //  两位小数
                        cell.setCellValue(fValue);
                    } else if (value instanceof Double) {//Double
                        double dValue = (Double)value;
                        style2.setDataFormat(format.getFormat("0.00"));
                        cell.setCellValue(dValue);
                    } else if (value instanceof Long) {//Long
                        long longValue = (Long) value;
                        cell.setCellValue(longValue);
                    } else if (value instanceof Boolean) {//如果数据是Boolean那转化为男和女
                        boolean bValue = (Boolean) value;
                        textValue = "男";
                        if (!bValue) {
                            textValue = "女";
                        }
                    } else if (value instanceof Date) {
                        Date date = (Date) value;
                        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                        textValue = sdf.format(date);
                    } else if (value instanceof byte[]) {//字节类型默认为存储图片
                        // 有图片时,设置行高为60px;
                        row.setHeightInPoints(60);
                        // 设置图片所在列宽度为80px,注意这里单位的一个换算
                        sheet.setColumnWidth(i, (short) (35.7 * 80));
                        // sheet.autoSizeColumn(i);
                        byte[] bsValue = (byte[]) value;
                        HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
                                1023, 255, (short) 6, index, (short) 6, index);
                        anchor.setAnchorType(2);
                        patriarch.createPicture(anchor, workbook.addPicture(
                                bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
                    } else {
                        // 其它数据类型都当作字符串简单处理
                        textValue = value.toString();
                    }
                    // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
                    if (textValue != null) {
                        Pattern p = Pattern.compile("^//d+(//.//d+)?$");
                        Matcher matcher = p.matcher(textValue);
                        if (matcher.matches()) {
                            // 是数字当作double处理
                            cell.setCellValue(Double.parseDouble(textValue));
                        } else {
                            // 其它数据类型都当作字符串简单处理
                            HSSFRichTextString richString = new HSSFRichTextString(
                                    textValue);
                            HSSFFont font3 = workbook.createFont();
                            font3.setColor(HSSFColor.BLUE.index);
                            richString.applyFont(font3);
                            cell.setCellValue(richString);
                        }
                    }
                    cell.setCellStyle(style2);//设置一个单元格的样式
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } finally {
                    // 清理资源
                }
            }

        }
        try {
            workbook.write(out);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
  • 导入操作使用异步提交方式,讲文件导入,页面中使用JS代码进行回调
    当面临导入的操作的时候我的思路是有俩种,一是使用Form组件中的方法进行提交处理,然后JS中执行回调函数。二是使用Ajax进行提交处理,然后也是同样的对处理后的结果进行处理。当我写了一大堆的代码后发现,我写的JAVA类根本就没有办法获取到我页面上传的表单文件,才发现我们所有封装好的JavaJS的提交方式都是使用Ajax都是无法获取这个文件流的。然后思路转向了使用传统的方式对表单上传的文件进行提交,但是问题还是出现了,就是说我上传的文件上传完成后,系统应该给出相应的信息给前端的页面,是上传失败呢,还是上传成功呢。然而传统的Servlet又无法动态的对JavaJs框架的方法进行调用。最后还是放弃了对传统提交方式的解决方案。
    那么问题还是回到最初的问题就是需要异步进行提交,然后无刷新的执行回调函数,那么传统的Ajax提交是没有办法做到的,通过查找资料发现Jquery-form.js提供了这种方式进行异步提交并且可以回调函数,那么我果断采用了这种方式,话不多说上代码:
  • 页面表单
<form action="/Demo/servlet/ImportServlet" id="fileForm" name="fileForm"  enctype="multipart/form-data" method="post">
<input type="file" id="filename" name="filename" class="x-text" />
<input type="button" value="导入Excel"  class="x-button" onclick="importEmp()"/>
</form>
  • 页面Js代码
//Excel文件导入到数据库中
function importEmp() {
    // 检验导入的文件是否为Excel文件
    var filename = document.getElementById("filename").value;
    if (filename == null || filename == '') {
        javajs.warnmsg("请选择要上传的Excel文件");
        return false;
    } else {
        var filename = filename.substring(filename.lastIndexOf('.'))
                .toLowerCase();
        if (filename == '.xls') {
            var form = $("form[name=fileForm]");
            var options = {
                url : '/Demo/servlet/ImportServlet',
                type : 'post',
                success : function(reqobj) {
                    var jsondata = eval("("+reqobj+")");  
                    if (jsondata.result) {
                        parent.Ext.getCmp("import").close();
                        parent.javajs.successmsg(jsondata.msg);
                        var jtable = parent.Ext.getCmp("jtable");
                        jtable.updateModel();
                    } else {
                        javajs.errormsg(jsondata.msg);
                    }
                }
            };
            form.ajaxSubmit(options);
            // $("#fileForm").submit();
        } else {
            javajs.warnmsg("文件格式需为'.xls'格式");
            return false;
        }
    }
}
  • Servlet代码
package com.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
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 com.model.C_RES_R_TEST;
import com.newland.javajs.JsonReturn;
import com.tools.DbTools;

public class ImportServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        doPost(request, response);
    }

    @SuppressWarnings("unchecked")
    public void doPost(HttpServletRequest request, HttpServletResponse response) {

        InputStream fis = null;
        PrintWriter out = null;
        List<C_RES_R_TEST> infos = new ArrayList<C_RES_R_TEST>();
        C_RES_R_TEST cresrtest = null;

        DiskFileItemFactory diskFactory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(diskFactory);

        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8"); 
        try {
            out = response.getWriter();
            boolean flag = true;
            List<FileItem> fileItems = upload.parseRequest(request);//得到表单文件对象
            Iterator<FileItem> iter = fileItems.iterator();
            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();
                fis = item.getInputStream();
            }
            // 创建Excel工作薄
            HSSFWorkbook hwb = new HSSFWorkbook(fis);
            // 得到第一个工作表
            HSSFSheet sheet = hwb.getSheetAt(0);
            HSSFRow row = null;
            // 日期格式化
            DateFormat ft = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
            // 遍历该表格中所有的工作表,i表示工作表的数量 getNumberOfSheets表示工作表的总数
            for (int i = 0; i < hwb.getNumberOfSheets(); i++) {
                sheet = hwb.getSheetAt(i);
                // 遍历该行所有的行,j表示行数 getPhysicalNumberOfRows行的总数
                for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) {
                    row = sheet.getRow(j);
                    if (row.getPhysicalNumberOfCells() != 7) {
                        out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的列数不匹配,请重新上传!"));
                        flag = false;
                        break;
                    } else {
                        if (j == 0) {
                            if (!"ID".equals(getCellValue(row.getCell(0)))) {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第一列不的值不是ID,请重新上传!"));
                                flag = false;
                                break;
                            } else if (!"名称".equals(getCellValue(row.getCell(1)))) {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第二列不的值不是名称,请重新上传!"));
                                flag = false;
                                break;
                            } else if (!"地市".equals(getCellValue(row.getCell(2)))) {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第三列不的值不是地市,请重新上传!"));
                                flag = false;
                                break;
                            } else if (!"县区".equals(getCellValue(row.getCell(3)))) {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第四列不的值不是县区,请重新上传!"));
                                flag = false;
                                break;
                            } else if (!"时间".equals(getCellValue(row.getCell(4)))) {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第五列不的值不是时间,请重新上传!"));
                                flag = false;
                                break;
                            } else if (!"经度".equals(getCellValue(row.getCell(5)))) {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第六列不的值不是经度,请重新上传!"));
                                flag = false;
                                break;
                            } else if (!"纬度".equals(getCellValue(row.getCell(6)))) {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第七列不的值不是纬度,请重新上传!"));
                                flag = false;
                                break;
                            }
                        } else {
                            cresrtest = new C_RES_R_TEST();
                            if (getCellValue(row.getCell(0)) != null && !"".equals(getCellValue(row.getCell(0)))) {
                                cresrtest.setSysIntId((new Long((long)row.getCell(0).getNumericCellValue())).intValue());//ID类型转化比较复杂
                            } else {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1) + "行的ID值为空,请重试!"));
                                flag = false;
                                break;
                            }
                            if (getCellValue(row.getCell(1)) != null && !"".equals(getCellValue(row.getCell(1)))) {
                                cresrtest.setLocationName(getCellValue(row.getCell(1)));
                            } else {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1)  + "行的名称值为空,请重试!"));
                                flag = false;
                                break;
                            }
                            if (getCellValue(row.getCell(2)) != null && !"".equals(getCellValue(row.getCell(2)))) {
                                cresrtest.setCity(getCellValue(row.getCell(2)));
                            } else {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1)  + "行的地市值为空,请重试!"));
                                flag = false;
                                break;
                            }
                            if (getCellValue(row.getCell(3)) != null && !"".equals(getCellValue(row.getCell(3)))) {
                                cresrtest.setCounty(getCellValue(row.getCell(3)));
                            } else {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1)  + "行的县区值为空,请重试!"));
                                flag = false;
                                break;
                            }
                            if (getCellValue(row.getCell(4)) != null && !"".equals(getCellValue(row.getCell(4)))) {
                                cresrtest.setTime(ft.parse(getCellValue(row.getCell(4))));
                            } else {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1)  + "行的时间值为空,请重试!"));
                                flag = false;
                                break;
                            }
                            if (getCellValue(row.getCell(5)) != null && !"".equals(getCellValue(row.getCell(5)))) {
                                cresrtest.setGeoLongitude(Float.parseFloat(getCellValue(row.getCell(5))));
                            } else {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1)  + "行的经度值为空,请重试!"));
                                flag = false;
                                break;
                            }
                            if (getCellValue(row.getCell(6)) != null && !"".equals(getCellValue(row.getCell(6)))) {
                                cresrtest.setGeoLatitude(Float.parseFloat(getCellValue(row.getCell(6))));
                            } else {
                                out.println(JsonReturn.createErrorMsgReturn("您上传的Excel表格的第" + (j+1)  + "行的纬度值为空,请重试!"));
                                flag = false;
                                break;
                            }
                            infos.add(cresrtest);
                        }
                    }
                }
            }
            if(infos.size() != 0 && flag)
                out.println(intoDataBase(infos));
            else if(infos.size() == 0 && flag)
                out.println(JsonReturn.createErrorMsgReturn("您上传的表格没有任何数据,请重新上传!"));
            //out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public JsonReturn intoDataBase(List<C_RES_R_TEST> infos) {

        // 判断导入数据库中是否出错的标志
        boolean flag = true;
        // 遍历解析Excel的实体集合
        for (C_RES_R_TEST info : infos) {
            // 判断订单编号是否存在(存在:做修改操作;不存在:做新增操作)
            if (DbTools.isExistById(info.getSysIntId())) {
                // update
                if (DbTools.isExistForUpdate(info)) {
                    return JsonReturn.createErrorMsgReturn("表格中有数据已存在数据库,请修改!");
                } else{
                    flag = DbTools.update(info);
                }
            } else {
                // add
                if (DbTools.isExistByAdd(info)) {
                    return JsonReturn.createErrorMsgReturn("表格中有数据已存在数据库,请修改!");
                } else{
                    flag = DbTools.addForHaveId(info);
                }
            }
            // 数据导入出错,马上退出循环
            if (!flag)
                break;

        }
        if (!flag)
            return JsonReturn.createErrorMsgReturn("数据导入失败!");
        else
            return JsonReturn.createSuccessMsgReturn("数据导入成功!");
    }

    // 判断从Excel文件中解析出来数据的格式
    public static String getCellValue(HSSFCell cell) {
        String value = null;
        // 简单的查检列类型
        switch (cell.getCellType()) {
        case HSSFCell.CELL_TYPE_STRING:// 字符串
            value = cell.getRichStringCellValue().getString();
            break;
        case HSSFCell.CELL_TYPE_NUMERIC:// 数字
            double dd = (double) cell.getNumericCellValue();
            value = Double.toString(dd);
            break;
        case HSSFCell.CELL_TYPE_BLANK:
            value = "";
            break;
        case HSSFCell.CELL_TYPE_FORMULA:
            value = String.valueOf(cell.getCellFormula());
            break;
        case HSSFCell.CELL_TYPE_BOOLEAN:// boolean型值
            value = String.valueOf(cell.getBooleanCellValue());
            break;
        case HSSFCell.CELL_TYPE_ERROR:
            value = String.valueOf(cell.getErrorCellValue());
            break;
        default:
            break;
        }
        return value;
    }

}
  • 实体对象代码
package com.model;

import java.util.Date;

public class C_RES_R_TEST {
    private int sysIntId;
    private String locationName;
    private String city;
    private String county;
    private Date time;
    private Float geoLongitude;
    private Float geoLatitude;

    public int getSysIntId() {
        return sysIntId;
    }

    public void setSysIntId(int sysIntId) {
        this.sysIntId = sysIntId;
    }

    public String getLocationName() {
        return locationName;
    }

    public void setLocationName(String locationName) {
        this.locationName = locationName;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCounty() {
        return county;
    }

    public void setCounty(String county) {
        this.county = county;
    }

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    public Float getGeoLongitude() {
        return geoLongitude;
    }

    public void setGeoLongitude(Float geoLongitude) {
        this.geoLongitude = geoLongitude;
    }

    public Float getGeoLatitude() {
        return geoLatitude;
    }

    public void setGeoLatitude(Float geoLatitude) {
        this.geoLatitude = geoLatitude;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值