poi导入excel

来源:互联网 发布:淘宝买家数据 编辑:程序博客网 时间:2024/06/14 14:01

使用poi进行导入导出excel是我们开发中常见的应用场景!

  1. 导入必要的jar包

    这里写图片描述

  2. 创建读取excel的工具类–ExcelUtils

public class ExcelUtils {    /**     * 读取excel文件     *     * @param in     * @param     * @return     * @throws Exception     */    public static List<LineDownOrder> getBankListByExcel(InputStream in) throws Exception {        List<LineDownOrder> lineDownOrders = new ArrayList<>();        //创建Excel工作薄        Workbook work = getWorkbook(in);        if (null == work) {            throw new Exception("创建Excel工作薄为空!");        }        Sheet sheet = null;        Row row = null;        Cell cell = null;        //遍历Excel中所有的sheet        for (int i = 0; i < work.getNumberOfSheets(); i++) {            sheet = work.getSheetAt(i);            if (sheet == null) {                continue;            }            //遍历当前sheet中的所有行            for (int j =1; j <= sheet.getLastRowNum(); j++) {                row = sheet.getRow(j);                if (row == null ) {                    continue;                }                LineDownOrder lineDownOrder = new LineDownOrder();                    //把每个单元格的值付给对象的对应属性                if (row.getCell(0)!=null){                    lineDownOrder.setInsureNo(String.valueOf(getCellValue(row.getCell(0))));                }                if (row.getCell(1)!=null){                    lineDownOrder.setPayMoney(String.valueOf(getCellValue(row.getCell(1))));                }                if (row.getCell(2)!=null){                    lineDownOrder.setPayType(String.valueOf(getCellValue(row.getCell(2))));                }                if (row.getCell(3)!=null){                    lineDownOrder.setRepaymentPerson(String.valueOf(getCellValue(row.getCell(3))));                }                if (row.getCell(4)!=null){                    lineDownOrder.setRepaymentType(String.valueOf(getCellValue(row.getCell(4))));                }                if (row.getCell(5)!=null){                    lineDownOrder.setPayTime(String.valueOf(getCellValue(row.getCell(5))));                }                if (row.getCell(6)!=null){                    lineDownOrder.setTradeNo(String.valueOf(getCellValue(row.getCell(6))));                }                //遍历所有的列(把每一行的内容存放到对象中)                lineDownOrders.add(lineDownOrder);            }        }        return lineDownOrders;    }    /**     *     * @param inStr     * @return     * @throws Exception     */    public static Workbook getWorkbook(InputStream inStr) throws Exception {        Workbook wb = null;        wb = WorkbookFactory.create(inStr);        return wb;    }    /**     * 描述:对表格中数值进行格式化     *     * @param cell     * @return     */    public static Object getCellValue(Cell cell) {        Object value = null;        DecimalFormat df = new DecimalFormat("0");  //格式化number String字符        SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");  //日期格式化        DecimalFormat df2 = new DecimalFormat("0.00");  //格式化数字        switch (cell.getCellType()) {            case Cell.CELL_TYPE_STRING:                value = cell.getRichStringCellValue().getString();                break;            case Cell.CELL_TYPE_NUMERIC:                if ("General".equals(cell.getCellStyle().getDataFormatString())) {                    value = df.format(cell.getNumericCellValue());                } else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) {                    value = sdf.format(cell.getDateCellValue());                } else {                    value = df2.format(cell.getNumericCellValue());                }                break;            case Cell.CELL_TYPE_BOOLEAN:                value = cell.getBooleanCellValue();                break;            case Cell.CELL_TYPE_BLANK:                value = "";                break;            default:                break;        }        return value;    }}

注意:上面我写的这个不是通用的,只是针对于我做的一个excel模版来读取的,把读取到的值赋值到实体bean里,然后放入到,集合。之后传到业务层,根据里面的字段来更新数据库一些表的状态,信息。我这里的应用场景比较简单,就采用了这种方法。

使用WorkbookFactory来创建工作薄,同时兼容excel的.xls以及.xlsx格式。

wook: 工作薄,其实就是一个excel文件。

sheet: 工作表,一个excel可能有多个表。

Row: 列,每一列。

cell: 单元格。excel的最小单位。 .

在读取的时候可以把每一行看作一个实体bean,在遍历行的时候进行赋值。之后放入集合中。

上传的页面比较简单,一个标准的上传标签。

<form id="uploadForm" enctype="multipart/form-data" action="#">    <table>        <tr>            <td style="width: 10%">                <input class="file" id="upfile" type="file" name="upfile"/>            </td>        </tr>        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;        <tr>&nbsp;&nbsp;&nbsp;&nbsp;            <td style="width: 15%">                <input class="btn btn-primary btn-md" type="button" value="导入" id="upLoadPayerCreditInfoExcel"                       name="btn"/>            </td>        </tr>    </table></form>

我这里使用ajax请求传递文件

<script type="text/javascript">    // <![CDATA[    $('#upLoadPayerCreditInfoExcel').click(function () {        if (checkData()) {            var formData = new FormData();            formData.append("upfile", document.getElementById("upfile").files[0]);            $.ajax({                url: ,                type: "post",                data: formData,                contentType: false,                processData: false,                success: function (data) {                        alert(data.status);                },            });        }    });    //JS校验form表单信息    function checkData() {        var fileDir = $("#upfile").val();        var suffix = fileDir.substr(fileDir.lastIndexOf("."));        if ("" == fileDir) {            alert("选择需要导入的Excel文件!");            return false;        }        if (".xls" != suffix && ".xlsx" != suffix) {            alert("选择Excel格式的文件导入!");            return false;        }        return true;    }    // ]]></script>

后台controller层可以用 MultipartFile来接收文件。

 /**     * 读取excel更新数据     *     * @param upfile     * @param     * @param     * @throws Exception     */    @RequestMapping(value = "/readExcel")    @Transactional    public Map<String, String> readExcel(MultipartFile upfile) throws Exception {        HashMap<String, String> map = new HashMap<>();        InputStream in = upfile.getInputStream();        //读取excel中的内容        List<LineDownOrder> lineDownOrders = ExcelUtils.getBankListByExcel(in);        String s = orderService.updateByExcel(lineDownOrders);        map.put("status", s);        return map;    }

最后,在这里温馨提示大家,excel里面的数据格式调整为文本比较好,这样都会以string类型去读取,后台代码比较好控制。

原创粉丝点击