poi导入excel

使用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类型去读取,后台代码比较好控制。

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值