`
wang_2011_ying
  • 浏览: 150033 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Poi读写Excel,合并ExcelSheet Struts2实现

 
阅读更多
[转贴]
网上有许多人在找这样的例子,有多个Excel,要把他们合并到一个Excel里面,这里涉及无非是Excel的读取和Sheet的合并。
我做了这样一个实现,可以参考,当然更希望指点。使用Struts实现他的上传功能,在把多个Excel上传到Action后,进行合并,然后直接执行下载。也就是说,我们一个Action里要动用Struts2的上传和下载两个功能。

实现的步骤:
1.拷贝Struts的包到工程(估计都会吧,Ctrl+C 加 Ctrl + V)
2.在Web.xml里配置Struts2,也不难


    <?xml version="1.0" encoding="UTF-8"?>  
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
        <filter>  
            <filter-name>struts2</filter-name>  
            <filter-class>  
                org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
            </filter-class>  
        </filter>  
        <filter-mapping>  
            <filter-name>struts2</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>  
        <welcome-file-list>  
            <welcome-file>index.jsp</welcome-file>  
        </welcome-file-list>  
    </web-app>  


3.定义Struts2的配置文件
    <?xml version="1.0" encoding="UTF-8" ?>  
    <!DOCTYPE struts PUBLIC  
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
        "http://struts.apache.org/dtds/struts-2.0.dtd">  
    <struts>  
        <!-- 一些基本配置,自己看着办 -->  
        <constant name="struts.devMode" value="false"></constant>  
        <constant name="struts.i18n.reload" value="true"></constant>  
        <constant name="struts.i18n.encoding" value="UTF-8"></constant>  
        <constant name="struts.multipart.saveDir" value="C:\\"></constant>  
        <constant name="struts.multipart.maxSize" value="20971520"></constant>  
        <package name="default" namespace="/" extends="struts-default">  
            <action name="doUpload"  
                class="com.golden.action.StrutsFileUpload">  
                <result name="success" type="stream">  
                    <param name="contentType">  
                        application/vnd.ms-excel  
                    </param>  
                    <param name="contentDisposition">  
                        attachment;filename="TEST.xls"  
                    </param>  
                    <param name="inputName">downLoadStream</param>  
                    <param name="bufferSize">4096</param>  
                </result>  
            </action>  
        </package>  
    </struts>  


注意:
contentType:要设置为下载类型为Excel,当然这些可以在Actoin里动态定义,想实现的具体再说。
contentDisposition:里面千万不要忘了attachment;不然可能会出一些问题,当然也许有的人不写。后面是下载的文件名,也可以在Action里定义。
inputName:真正执行下载的方法
bufferSize:缓冲区大小


4.写一个上传页面
    <%@ page language="java" pageEncoding="UTF-8"%>  
    <%@ taglib prefix="s" uri="/struts-tags" %>  
    <%  
    String path = request.getContextPath();  
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    %>  
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    <html>  
      <head>  
        <base href="<%=basePath%>">      
        <title>多文件Excel分析</title>  
        <meta http-equiv="pragma" content="no-cache">  
        <meta http-equiv="cache-control" content="no-cache">  
        <meta http-equiv="expires" content="0">      
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
        <meta http-equiv="description" content="This is my page">  
      </head>    
      <body>  
        <center>  
            <s:form action="doUpload" method="POST" enctype="multipart/form-data">  
                <s:file name="upload" label="上传的文件1" />  
                <s:file name="upload" label="上传的文件2" />  
                <s:file name="upload" label="上传的文件3" />  
                <s:file name="upload" label="上传的文件4" />  
                <s:file name="upload" label="上传的文件5" />  
                <s:file name="upload" label="上传的文件6" />  
                <s:submit value="上   传"/>  
            </s:form>  
        </center>  
      </body>  
    </html>  

注意:
里面使用了Struts2的标签,也可以直接使用Html标签

4.最关键的部分,写Action的类
    package com.golden.action;  
      
    import java.io.ByteArrayInputStream;  
    import java.io.ByteArrayOutputStream;  
    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.InputStream;  
      
    import org.apache.poi.hssf.usermodel.HSSFCell;  
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;  
    import org.apache.poi.hssf.usermodel.HSSFRow;  
    import org.apache.poi.hssf.usermodel.HSSFSheet;  
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
      
    import com.opensymphony.xwork2.ActionSupport;  
      
    import java.math.*;  
    import java.text.NumberFormat;  
      
    @SuppressWarnings("serial")  
    public class StrutsFileUpload extends ActionSupport {  
      
        private File[] upload;// 实际上传文件  
      
        private String[] uploadContentType; // 文件的内容类型  
      
        private String[] uploadFileName; // 上传文件名  
      
        /** 
         * 请求的Action 
         */  
        @Override  
        public String execute() throws Exception {  
            return "success";  
        }  
      
        /** 
         * 真正的下载方法 
         *  
         * @return 
         * @throws Exception 
         */  
        @SuppressWarnings("deprecation")  
        public InputStream getDownLoadStream() throws Exception {  
            HSSFWorkbook wb = new HSSFWorkbook();  
            // 设置一个靠右排放样式,如果需要其他样式自可以再定义一些  
            HSSFCellStyle style = wb.createCellStyle();  
            // style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
            style.setAlignment(HSSFCellStyle.ALIGN_RIGHT); // 在单元格中右排放  
            try {  
                for (int i = 0; i < upload.length; i++) {  
                    File f = upload[i]; // 取得一个文件  
                    FileInputStream is = new FileInputStream(f);  
                    HSSFWorkbook wbs = new HSSFWorkbook(is);  
                    // 根据读出的Excel,创建Sheet  
                    HSSFSheet sheet = wb.createSheet(uploadFileName[i]);  
                    // 一直取的是第一个Sheet,一定要注意,如果你要读取所有的Sheet,循环读取即可  
                    HSSFSheet childSheet = wbs.getSheetAt(0);  
                    // 循环读取Excel的行  
                    for (int j = 0; j < childSheet.getLastRowNum(); j++) {  
                        // 根据读取的行,创建要合并Sheet的行  
                        HSSFRow r = sheet.createRow(j);  
                        HSSFRow row = childSheet.getRow(j);  
                        // 判断是否为空,因为可能出现空行的情况  
                        if (null != row) {  
                            // 循环读取列  
                            for (int k = 0; k < row.getLastCellNum(); k++) {  
                                // 根据读取的列,创建列  
                                HSSFCell c = r.createCell(k);  
                                HSSFCell cell = row.getCell(k);  
                                // 将值和样式一同赋值给单元格  
                                String value = "";  
                                if (null != cell) {  
                                    switch (cell.getCellType()) {  
                                    case HSSFCell.CELL_TYPE_NUMERIC: // 数值型  
                                        if (HSSFDateUtil.isCellDateFormatted(cell)) {  
                                            // 如果是Date类型则 ,获取该Cell的Date值  
                                            value = HSSFDateUtil.getJavaDate(  
                                                    cell.getNumericCellValue())  
                                                    .toString();  
                                        } else {// 纯数字,这里要判断是否为小数的情况,因为整数在写入时会被加上小数点  
                                            String t = cell.getNumericCellValue()  
                                                    + "";  
                                            BigDecimal n = new BigDecimal(cell  
                                                    .getNumericCellValue());  
                                            // 判断是否有小数点  
                                            if (t.indexOf(".") < 0) {  
                                                value = n.intValue() + "";  
                                            } else {  
                                                // 数字格式化对象  
                                                NumberFormat nf = NumberFormat  
                                                        .getInstance();  
                                                // 小数点最大两位  
                                                nf.setMaximumFractionDigits(2);  
                                                // 执行格式化  
                                                value = nf.format(n.doubleValue());  
                                            }  
                                        }  
                                        break;  
                                    case HSSFCell.CELL_TYPE_STRING: // 字符串型  
                                        value = cell.getRichStringCellValue()  
                                                .toString();  
                                        break;  
                                    case HSSFCell.CELL_TYPE_FORMULA:// 公式型  
                                        // 读公式计算值  
                                        value = String.valueOf(cell  
                                                .getNumericCellValue());  
                                        break;  
                                    case HSSFCell.CELL_TYPE_BOOLEAN:// 布尔  
                                        value = " " + cell.getBooleanCellValue();  
                                        break;  
                                    /* 此行表示该单元格值为空 */  
                                    case HSSFCell.CELL_TYPE_BLANK: // 空值  
                                        value = " ";  
                                        break;  
                                    case HSSFCell.CELL_TYPE_ERROR: // 故障  
                                        value = " ";  
                                        break;  
                                    default:  
                                        value = cell.getRichStringCellValue()  
                                                .toString();  
                                    }  
                                } else {  
                                    value = " ";  
                                }  
                                c.setCellValue(value);  
                                c.setCellStyle(style);  
                            }  
                        } else {  
                            HSSFCell c = r.createCell(0);  
                            c.setCellValue(" ");  
                        }  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            // 这种写法不会产生临时文件,因为这里使用字节数组作为介质  
            ByteArrayOutputStream os = new ByteArrayOutputStream();  
            wb.write(os);  
            byte[] content = os.toByteArray();  
            InputStream is = new ByteArrayInputStream(content);  
            return is;  
        }  
      
        public File[] getUpload() {  
            return upload;  
        }  
      
        public void setUpload(File[] upload) {  
            this.upload = upload;  
        }  
      
        public String[] getUploadContentType() {  
            return uploadContentType;  
        }  
      
        public void setUploadContentType(String[] uploadContentType) {  
            this.uploadContentType = uploadContentType;  
        }  
      
        public String[] getUploadFileName() {  
            return uploadFileName;  
        }  
      
        public void setUploadFileName(String[] uploadFileName) {  
            this.uploadFileName = uploadFileName;  
        }  
      
    }  

这里要关注的地方太多,具体的代码里注释写的很清楚。

一定要注意的是要判断单元格的类型,特别是数字类型时,我根据自己的需求一定了一些处理。
分享到:
评论

相关推荐

    Poi 读写Excel 合并ExcelSheet Struts2实现

    本篇文章将详细介绍如何利用Apache POI与Struts2来实现Excel的读写以及合并多个Excel工作表。 首先,Apache POI提供了HSSF和XSSF两个API,分别用于处理老版本的BIFF格式(.xls)和新版本的OOXML格式(.xlsx)。要...

    poi读写excel

    poi读写excelpoi读写excelpoi读写excelpoi读写excelpoi读写excelpoi读写excelpoi读写excelpoi读写excelpoi读写excel

    poi读写excel+poi总结

    在本文中,我们将深入探讨如何使用POI进行Excel的读写操作,并进行总结。 1. POI基本概念 Apache POI 提供了HSSF(Horrible Spreadsheet Format)用于读写旧版的.xls格式的Excel文件,而XSSF则用于处理.xlsx格式的...

    poi实现多sheet合并

    在IT行业中,尤其是在数据分析、报表处理等领域,经常需要对Excel...通过以上步骤,你可以实现将多个Excel文件的多个Sheet合并到一个新文件中,每个Sheet对应源文件的一个Sheet,满足了“poi实现多sheet合并”的需求。

    POI读写excel文件+poi简单文档

    在这个“POI读写excel文件+poi简单文档”中,我们将深入探讨如何利用Apache POI进行Excel文件的读写操作。 首先,我们需要了解POI的主要组件:HSSF(Horrible Spreadsheet Format)用于处理旧版的BIFF格式(.xls)...

    java用poi读写excel表

    本文将详细介绍如何使用POI库在Java中进行Excel的读写操作,以及一个在Eclipse环境中运行的实例。 首先,我们需要了解Apache POI的基本概念。POI是Apache软件基金会的一个开源项目,它提供了Java API来处理...

    POI操作Excel合并单元格边框问题解决方法

    POI操作Excel 合并单元格 边框问题解决方法,这个方法是我亲自测试,并运用于项目中的,可以放心使用,还一并写出了很多注释,其中有写poi的bug的解决方法

    POI读取Excel合并单元格并储存

    本文将深入探讨如何使用Java的Apache POI库来读取Excel文件,并处理其中合并单元格的数据,同时将这些数据存储到实体类中以供后续使用。 Apache POI是一个强大的库,允许程序员使用Java来创建、修改和显示Microsoft...

    struts2+poi实现导出Excel文件

    Struts2 和 Apache POI 的结合使用...通过以上步骤,可以成功利用 Struts2 和 Apache POI 实现 Web 应用程序中的 Excel 导出功能。这个功能广泛应用于数据分析、报表生成、数据交换等多种场景,极大地提高了工作效率。

    struts2 poi导出到excel

    在Struts2中实现数据导出到Excel,首先需要在项目中引入Apache POI的依赖库。这通常通过在Maven或Gradle的构建文件中添加相应的依赖完成。例如,在Maven的pom.xml文件中,可以添加如下依赖: ```xml &lt;groupId&gt;org...

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...

    struts2+poi实现excel表格导出

    通过以上讲解,我们可以看到,结合Struts2和Apache POI,我们可以轻松实现动态生成和导出Excel表格的功能,满足企业级Web应用的需求。提供的文档和网页资源应该会进一步细化这一过程,帮助开发者更好地理解和实践。

    java poi 读写excel

    这篇博客文章可能详细介绍了如何使用Java POI进行Excel的读写操作。 在Java开发中,使用POI库可以实现以下功能: 1. **创建Excel工作簿**:通过`WorkbookFactory.create()`方法可以创建一个新的Excel工作簿对象,...

    基于POI的Excel多Sheet页导出导入工具类

    "基于POI的Excel多Sheet页导出导入工具类"是一个实用的Java类库,专为处理Excel文件中的多个工作表(Sheet)而设计,提供了一种高效且灵活的方式来操作Excel数据。 该工具类的核心功能包括: 1. **多Sheet页操作**...

    利用POI合并多个Excel表

    本教程将深入探讨如何利用Apache POI库来合并多个Excel工作表,这对于处理大量数据或者整合来自不同来源的数据时非常有用。 首先,我们需要了解Apache POI的基本概念。POI提供了HSSF(Horrible Spreadsheet Format...

    struts2中利用poi导出excel

    总结起来,利用Struts2和Apache POI,我们可以方便地实现从Web应用中导出数据到Excel的功能。这涉及到对POI库的理解,以及Struts2 Action和Result的配置。通过这种方式,开发者可以为用户提供便捷的数据导出服务,...

    ExcelDemo_Excel导出_下载_POI读excel_JXL读写excel_java读写excel_列宽_读取合并或拆分单元格内容

    总的来说,Java开发者可以通过Apache POI和JExcelAPI轻松地读写Excel文件,进行各种操作,如设置列宽、处理合并或拆分的单元格。理解并熟练掌握这些库,将极大地提升你在处理Excel数据时的效率。在实际项目中,根据...

    apache POI文件读写excel

    在本文中,我们将深入探讨如何使用Apache POI进行Excel文件的读写操作,以及相关的技术细节。 1. **Apache POI的基本概念** - **HSSF**: 用于处理旧版的BIFF格式(.xls)的Excel文件。 - **XSSF**: 用于处理基于...

    struts2+poi实现excel文件的导出

    Struts2 和 Apache POI 的整合允许开发者轻松地实现在 Web 应用程序中导出 Excel 文件的功能。Apache POI 是一个 Java 库,它提供了处理 Microsoft Office 格式(如 .xls 和 .xlsx)的能力,包括创建、读取和修改 ...

    poi读写excel文件

    poi读写excel文件,解析xls文件中的内容:得到行数据,返回行数据数组

Global site tag (gtag.js) - Google Analytics