Java服务端读取excel文件xls格式内容

原创 2016年05月31日 14:51:41
  最近需要读取从客户端发送过来的excel文件内容,excel文件的格式是事先规定好的不变的。所以就研究了一下,因为是自己写的需要测试所以先写了个简单的网页上传文件,看客户端上传文件代码:
<html>
<body>
<div class="offset1 span10 container-fluid">
            <form id="firmForm" class="form-horizontal"
                action="/front/cashFlow/payForAnotherInformationList.htm"
                method="post" enctype="multipart/form-data" accept-charset="utf-8">

                <div class="control-group">
                    <div class="control-group">
                        <label class="control-label" for="input01">上传文件:</label>
                        <div class="controls" style="padding-top: 5px">
                            <input id="entrustFile" name="entrustFile" type="file" value="文件">
                        </div>
                    </div>

                <input name="btnSubmit" type="button" class="tjBtn" id="btnSubmit"
                        value="提交" onclick="javascript:submit();"/>

            </form>
    </div>

</body>
</html>

<script type="text/javascript">
    function submit() {
        document.getElementById("firmForm").submit();
    }
</script>

客户端的工作完成了可以上传文件测试了,现在主要介绍服务端的工作,首先我为了解析excel文件的内容导入一个框架:poi-3.9-20121203.jar
然后我们第一步要做的是从request中获取到这个文件,将HttpServletRequest类型的请求强转成MultipartHttpServletRequest类型的请求,然后MultipartHttpServletRequest有个方法,可以通过文件名获取文件,获取到文件后通过getInputStream()函数获取文件内容:

    /**
     * Return the contents plus description of an uploaded file in this request,
     * or {@code null} if it does not exist.
     * @param name a String specifying the parameter name of the multipart file
     * @return the uploaded content in the form of a {@link MultipartFile} object
     */
    MultipartFile getFile(String name);

接下来直接看源码:

    /**
     * 读取excel文件
     */
    public List<CashOutRecord> haveFileFromClient(HttpServletRequest request) throws IOException {
        // 转型为MultipartHttpRequest:
        MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
        // 获得文件:
        MultipartFile contactFile = multiRequest.getFile("entrustFile");
        // 获取的代付信息列表
        List<CashOutRecord> resultList = new ArrayList<CashOutRecord>();
        if (null != contactFile && !contactFile.isEmpty()) {
            //解析文档
            POIFSFileSystem fs;
            //获取整个文档
            HSSFWorkbook wb;
            // 页
            HSSFSheet sheet;
            // 行
            HSSFRow row;
            // 打开文件
            try {

                fs = new POIFSFileSystem(contactFile.getInputStream());
                wb = new HSSFWorkbook(fs);
            } catch (IOException e) {
                e.printStackTrace();
                wb = new HSSFWorkbook();
            }
            String entrustNo = RandomStringUtils.randomNumeric(9);
            //获取第一页
            sheet = wb.getSheetAt(0);
            // 得到总行数
            int rowNum = sheet.getLastRowNum();
            // 正文内容应该从第二行开始,第一行为表头的标题
            for (int i = 1; i <= rowNum; i++) {
                String outNo = entrustNo + "_" + RandomStringUtils.randomNumeric(6);
                row = sheet.getRow(i);
                String accountType = "";
                String accountName = "";
                String accountNum = "";
                String bankName = "";
                String bankProv = "";
                String bankCity = "";
                BigDecimal amount = null;
                String bankBranch = "";
                String reason = "";
                try {
                    int idx = 0;
                    idx++;
                    accountType = getCellFormatValue(row.getCell(idx));
                    idx++;
                    accountName = getCellFormatValue(row.getCell(idx));
                    idx++;
                    accountNum = getCellFormatValue(row.getCell(idx));
                    idx++;
                    bankName = getCellFormatValue(row.getCell(idx));
                    idx++;
                    bankProv = getCellFormatValue(row.getCell(idx));
                    idx++;
                    bankCity = getCellFormatValue(row.getCell(idx));
                    idx++;
                    amount = new BigDecimal(getCellFormatValue(row.getCell(idx)));
                    idx++;
                    bankBranch = getCellFormatValue(row.getCell(idx));
                    idx++;
                    reason = getCellFormatValue(row.getCell(idx));

                    CashOutRecord cashEntrustRecord = new CashOutRecord();
                    cashEntrustRecord.setOutNo(outNo);
                    cashEntrustRecord.setAccountname(accountName);
                    cashEntrustRecord.setAccountnum(accountNum);
                    cashEntrustRecord.setBankname(bankName);
                    cashEntrustRecord.setBankbranch(bankBranch);
                    cashEntrustRecord.setBankprov(bankProv);
                    cashEntrustRecord.setBankcity(bankCity);
                    cashEntrustRecord.setAmount(amount);
                    if (accountType.equals("个人账户")) {
                        cashEntrustRecord.setAccounttype(11);
                    } else if (accountType.equals("企业账户")) {
                        cashEntrustRecord.setAccounttype(12);
                    }
                    cashEntrustRecord.setRemark(reason);
                    resultList.add(cashEntrustRecord);
                } catch (Exception ex) {
                    System.out.print(ex);
                }
            }
            return resultList;
        }
        return null;
    }


----------
对于每个excel文件的表格中内容的格式我们也要做处理
----------


    /**
     * 匹配excel表格cell的类型
     */
    private String getCellFormatValue(HSSFCell cell) {
        String cellvalue = "";
        if (cell != null) {
            // 判断当前Cell的Type
            switch (cell.getCellType()) {
            // 如果当前Cell的Type为NUMERIC
            case HSSFCell.CELL_TYPE_NUMERIC:
            case HSSFCell.CELL_TYPE_FORMULA: {
                // 判断当前的cell是否为Date
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    Date date = cell.getDateCellValue();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    cellvalue = sdf.format(date);
                }
                // 如果是纯数字
                else {
                    // 取得当前Cell的数值
                    cellvalue = String.valueOf(cell.getNumericCellValue());
                }
                break;
            }
            // 如果当前Cell的Type为STRIN
            case HSSFCell.CELL_TYPE_STRING:
                // 取得当前的Cell字符串
                cellvalue = cell.getRichStringCellValue().getString();
                break;
            // 默认的Cell值
            default:
                cellvalue = " ";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;
    }
版权声明:本文已经搬迁到博主个人网站:http://13fafa.cn。

Java读写Excel文件(Java Excel API)

下载地址:http://www.andykhan.com/jexcelapi/download.html

Java Web的Excel读取

“` //获取输出流 outputStream = response.getOutputStream();//定义流读取文件 input = new FileInputStream(con...

java web项目中导入excel 到数据库

数据库中的表: 和javaBean中对应 javaBean: public class mainpart { private int id; private String name;//...

Java上传下载excel、解析Excel、生成Excel的问题

转载:http://blog.sina.com.cn/s/blog_62e304920100qb0i.html  在软件开发过程中难免需要批量上传与下载,生成报表保存也是常有之事,最...

Java读取Excel文件

1.jxl,poi简介 Java读取Excel文件有两种途径,jxl跟poi方式,其中jxl只能处理xls的文件,现已停止更新,而poi方式可以处理xls跟xlsx文件。推荐使用poi方式。 相关ja...

Spring MultipartFile 上传 与 excel处理

一、配置 1、*-servlet.xml  (WebApploicationContext) !-- file upload -->     bean id="multipartReso...

Spring MultipartFile 上传 与 excel处理

转载来源http://blog.csdn.net/libaolin198706231987/article/details/52524133 一、配置 1、*-servlet.xml ...

Java读取Excel并解析文本(并格式化输出)

java解析excel并批量入库
  • Readiay
  • Readiay
  • 2015年05月06日 20:00
  • 70324

springMVC从上传的Excel文件中读取数据

示例:导入客户文件(Excle文件) 一、编辑customer.xlsx 二、在spring的xml文件设置上传文件大小 上传文件拦截,设置最大上传文件大小 10M=10*1024*102...

从HttpServletRequest request, 中读取数据流中的内容

BufferedReader in=new BufferedReader(new InputStreamReader(request.getInputStream()));   StringBuil...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java服务端读取excel文件xls格式内容
举报原因:
原因补充:

(最多只允许输入30个字)