`
cuisuqiang
  • 浏览: 3960272 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3670105
社区版块
存档分类
最新评论

Poi 读写Excel 合并ExcelSheet Struts2实现

    博客分类:
  • J2EE
阅读更多

网上有许多人在找这样的例子,有多个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:缓冲区大小

3.写一个上传页面

<%@ 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;
	}

}

 

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

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

 

请您到ITEYE看我的原创:http://cuisuqiang.iteye.com

或支持我的个人博客,地址:http://www.javacui.com

 

分享到:
评论

相关推荐

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

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

    poi实现多sheet合并

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

    poi读写excel

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

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

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

    struts2+poi实现导出Excel文件

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

    利用POI读取excel写入到word

    要实现"利用POI读取excel写入到word",我们需要以下步骤: 1. **准备环境**:首先,确保你的项目已经引入了Apache POI的依赖。在给定的压缩包中,"poi - 副本"可能是包含POI库的JAR文件,你需要将其添加到你的项目...

    poi读写excel+poi总结

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

    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 文件格式,包括 ...在本文中,我们已经详细介绍了如何使用 Java POI 实现 Excel 导入导出功能,包括读取和写入 Excel 文件。

    利用POI合并多个Excel表

    在IT领域,Apache POI是一个广泛使用的Java库,它允许开发者读取、写入和修改Microsoft Office格式的文件,特别是Excel工作簿。本教程将深入探讨如何利用Apache POI库来合并多个Excel工作表,这对于处理大量数据或者...

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

    在Java开发中,Apache POI库是一个非常重要的工具,它允许程序员读取、写入和修改Microsoft Office格式的文件,包括Excel。"基于POI的Excel多Sheet页导出导入工具类"是一个实用的Java类库,专为处理Excel文件中的多...

    struts2+poi实现excel表格导出

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

    struts2中利用poi导出excel

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

    POI读取excel的内容.zip

    通常,该类会包含一个或多个方法,比如`readExcel()`,来实现Excel的读取操作。以下是此类的一个基本结构: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; ...

    poi读取excel文件

    Apache POI提供了丰富的API,可以实现对Excel文件的复杂操作,如合并单元格、设置样式、处理公式等。在Android开发中,这些功能同样适用,但需要注意资源管理,因为Android设备的内存有限。 总的来说,Apache POI是...

    android5使用poi读取excel

    android5使用poi读取excel,android5使用poi读取excel,android5使用poi读取excel,android5使用poi读取excel

    poi获取exccel有合并单元格的数据

    本文将详细介绍如何使用Apache POI库来读取含有合并单元格的Excel文件,并将读取到的数据存储为`List`。 #### Apache POI简介 Apache POI是一个用于处理Microsoft Office格式文件的开源Java库。它提供了对Excel、...

    struts2+poi实现excel文件的导出

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

    POI生成Excel POI操作Excel POI读取Excel POI类库

    Apache POI是一个强大的Java库,专门用于处理...通过lib.rar和Poi02.rar中的示例代码,你可以更深入地了解和学习POI操作Excel的具体实现。在实践中,结合这些资源,你将能够熟练地在Java Web项目中集成Excel处理功能。

Global site tag (gtag.js) - Google Analytics