- 浏览: 13316 次
文章分类
最新评论
使用Java导出Excel案例详解
package com.wy.common.util;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
//这是一个导出Excel的工具类
public class ExportExcelUtils{
/**
* 这是一个通用的方法,将一个map集合作为表格内容输入到excel中
*
* @param title
* 表格标题名
* @param headers
* 表格属性列名数组
* @param rows
* 需要显示的数据集合,row为List
* @param rowkeys
* 与headers对应的map的key的集合数组
* @param conditionsDescrip
* xls说明
* @param out
* 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
*/
@SuppressWarnings("deprecation")
public void exportExcel(String title, String[] headers,List<Map> rows, String[] rowkeys, OutputStream out) {
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 25);
if(rows!=null && rows.size()>0 ){
//判断传入集合数据,如为空即不填充数据导出空Excel
/** ----------- 生成标题 ------------*/
//第一行写入标题
HSSFFont fontTitle = workbook.createFont();
HSSFCellStyle titleStyle = workbook.createCellStyle();
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
fontTitle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
fontTitle.setFontHeightInPoints((short) 16);
titleStyle.setFont(fontTitle);
if(headers!=null){
//这里作非空验证
sheet.addMergedRegion(new Region(0,(short)0,0,(short)(headers.length-1)));
}
HSSFRow rowTitle = sheet.createRow(0);
rowTitle.setHeight((short)500);
HSSFCell cellTitle = rowTitle.createCell(0);
cellTitle.setCellStyle(titleStyle);
cellTitle.setCellValue(title);
/** ----------- 生成表头 ------------*/
HSSFFont fontHeader = workbook.createFont();
fontHeader.setBoldweight(Font.BOLDWEIGHT_BOLD);
HSSFCellStyle cstyleHeader =workbook.createCellStyle();
cstyleHeader.setFont(fontHeader);
cstyleHeader.setAlignment(CellStyle.ALIGN_CENTER);
cstyleHeader.setBorderBottom(CellStyle.BORDER_THIN);
cstyleHeader.setBorderLeft(CellStyle.BORDER_THIN);
cstyleHeader.setBorderRight(CellStyle.BORDER_THIN);
cstyleHeader.setBorderTop(CellStyle.BORDER_THIN);
HSSFRow row = sheet.createRow(1);
for (short i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
//cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellStyle(cstyleHeader);
cell.setCellValue(text);
}
/** ----------- 生成数据行 ------------*/
int index = 2;
HSSFFont fontData = workbook.createFont();
fontData.setBoldweight(Font.BOLDWEIGHT_NORMAL);
HSSFCellStyle cstyleData =workbook.createCellStyle();
cstyleData.setBorderBottom(CellStyle.BORDER_THIN);
cstyleData.setBorderLeft(CellStyle.BORDER_THIN);
cstyleData.setBorderRight(CellStyle.BORDER_THIN);
cstyleData.setBorderTop(CellStyle.BORDER_THIN);
cstyleData.setFont(fontData);
cstyleData.setAlignment(CellStyle.ALIGN_CENTER);
/* HSSFCellStyle cstyleData1 =workbook.createCellStyle();
cstyleData1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cstyleData1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cstyleData1.setBorderRight(HSSFCellStyle.BORDER_THIN);
cstyleData1.setBorderTop(HSSFCellStyle.BORDER_THIN);
cstyleData1.setFont(fontData);
cstyleData1.setAlignment(HSSFCellStyle.ALIGN_LEFT);*/
for(Map row1 : rows){
row = sheet.createRow(index);
//获取map的所有需要导入到excel中数据key值
for(int i = 0 ; i < rowkeys.length ; i++){
HSSFCell cell = row.createCell(i);
cell.setCellStyle(cstyleData);
String key = rowkeys[i];
String cellValue="";
if(row1.get(key)!=null){
cellValue =row1.get(key).toString();
}
else{
cellValue="";
}
cell.setCellValue(cellValue);
}
index++;
}
/** ----------- 生成说明行 ------------*/
HSSFFont fontDesc = workbook.createFont();
HSSFCellStyle descStyle =workbook.createCellStyle();
descStyle.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
descStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
descStyle.setAlignment(CellStyle.ALIGN_LEFT);
descStyle.setVerticalAlignment(CellStyle.VERTICAL_TOP);
fontDesc.setFontHeightInPoints((short) 9);
descStyle.setFont(fontDesc);
//最后行写入描述
/*
sheet.addMergedRegion(new Region(index,(short)0,index,(short)(headers.length-1)));
HSSFRow rowDesc = sheet.createRow(index);
rowDesc.setHeight((short)1500);
HSSFCell cellDesc = rowDesc.createCell(0);
cellDesc.setCellStyle(descStyle);
descStyle.setWrapText(true);
cellDesc.setCellValue(new HSSFRichTextString(conditionsDescrip));
*/
}
try {
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*Action层中的方法*/
public String exportQuesByTypeAndId(){
try {
ExportExcelUtils<T> ex = new ExportExcelUtils<T>();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 获取查询数据
List<Map> rows = null;
String questionnaireId = ServletActionContext.getRequest().getParameter("questionnaireId");
TbInteractionQuestionnaire tbQuestionnaire=(TbInteractionQuestionnaire) questionnaireService.getDataBaseDao().load(TbInteractionQuestionnaire.class, questionnaireId);
String type=ServletActionContext.getRequest().getParameter("type");
rows = questionnaireService.exportQuesByTypeAndId(questionnaireId,type);
int i=0;
String name=tbQuestionnaire.getQuestionnaireTitle()+"_参与人员_"+DataConvertUtil.getCurrentDate();
if(rows!=null && rows.size()>0 && rows.get(0)!=null){
//headers 表示excel首行标题
String[] headers =new String[rows.get(0).size()];
//rowkeys 表示excel填充数据行对应的key
String[] rowkeys =new String[rows.get(0).size()];
System.out.println(rows.size());
Iterator ita = rows.get(0).entrySet().iterator();
while(ita.hasNext()){
/*这里面我将数据库查询出的数据字段名称
替换成对应中文作为Excel每列标题,将字段
名称直接作为数据行的key,分别将标题和
key存放在数组中,这里大家可以自定义
Excel的每列标题,key可以直接取库中
字段名称。
*/
Entry entry = (Entry)ita.next();
headers[i]=entry.getKey().toString().replaceAll("userAccount","工号/学号").replaceAll("orgName","部门").replaceAll("persontype", "类别").replaceAll("voteFlag","参与状态");
rowkeys[i]=entry.getKey().toString();
i++;
}
ex.exportExcel(name, headers, rows,
rowkeys,bos);
}
else{
/*
这里当数据集为空则传入null,
输出流对象必输传
*/
ex.exportExcelNoAnswerForQues(name
,null, null,null,bos);
}
byte[] fileBytes = bos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(fileBytes);
bos.close();
inputStream = bis;
//这里fileName指定为文件的名称(全局变量需要给出相应的getter,setter方法)
fileName = new String((name + ".xls").getBytes(),"ISO-8859-1");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
rspCode = RtnCodeConstant.RTN_CODE_UNKNOW_ERROR;
e.printStackTrace();
}
return SUCCESS;
}
//这里是struts的配置
<action name="exportQuesByTypeAndId"
class="queryQuertionnaireAction"
method="exportQuesByTypeAndId">
<result type="stream">
<param name="noCache">true</param>
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="bufferSize">false</param>
</result>
<result name="noSession">/jsps/login/no_session.jsp
</result>
</action>
//下图为数据库 中查询的数据
//注:导出excel需通过location.href 的方式直接请求后台方法,或者使用表单提交方式
相关推荐
### Java操作Excel详解 #### 一、Java Excel API简介 Java Excel API是一个强大的开源库,允许开发者使用Java语言轻松地创建、更新以及读取Excel文件。这个库支持多种Excel文件格式,包括较旧版本(如.xls)和较新...
### Java导出Excel的详细例子 #### 背景与目的 在许多业务场景中,我们需要将数据库中的数据导出到Excel文件中,方便进行数据分析、报表制作等操作。Java作为一种广泛使用的编程语言,在处理此类任务时具有强大的...
#### 三、案例详解 以下是一个使用Apache POI导出Excel文件的具体案例: ```java public class ExportExcel<T> { public HSSFWorkbook exportExcel(String strExpSheetName, Collection<T> dataset, OutputStream...
### Java大批量导出数据至Excel或XML技术详解 #### 技术背景及应用场景 在企业级应用开发中,经常需要处理大量数据的导出需求,例如报表导出、数据分析等场景。对于这类需求,使用Java进行批量数据导出至Excel或...
为了实现这个功能,我们选择使用了 NPOI 库,这是一个基于 Java POI 的.NET 版本库,用于读写 Excel 文件。同时,我们使用 ASP.NET MVC 框架作为后端开发平台。以下是具体的技术栈: - **前端**: jQuery、Bootstrap ...
标题"POI导入导出excel"指的是使用Apache POI库来处理Microsoft Excel文件,包括读取(导入)和写入(导出)数据。Apache POI是一个开源项目,允许Java开发者创建、修改和显示Microsoft Office格式的文件,其中Excel...
### Java后端生成PDF模板合并单元格表格案例详解 #### 概述 本文将详细介绍一个Java后端生成PDF模板,并在此基础上实现单元格合并功能的案例。案例的主要目的是展示如何在Java环境中创建复杂的表格结构,并将其导出...
《EasyExcel:JAVA解析Excel工具详解》 在Java开发中,处理Excel数据是一项常见的任务,例如数据导入导出、报表生成等。EasyExcel是阿里巴巴开源的一款高效、易用的Java库,专门用于处理Excel文件,它以其轻量级、...
在IT领域,特别是企业级应用开发中,Java作为一种广泛使用的编程语言,其处理文档的能力尤为重要。其中,将数据以特定格式导出至Word文档的需求在众多业务场景中频繁出现。本文将深入探讨如何利用Java技术结合...
本篇文章介绍了一个具体的Java实现案例:如何使用Java读取Excel文件,并将数据导入数据库的过程。这不仅适用于Java开发者学习相关技术,也对那些希望了解如何高效处理大量数据并进行存储的人来说具有很高的实用价值...
本案例中,"合并单元格导出数据到excel.rar"是一个压缩包,包含了一个Java代码示例,它实现了从数据库查询数据后,利用Apache POI库来生成包含合并单元格的Excel文件。以下是关于这个主题的详细知识点: 1. **Java...
### Java JSP水晶报表详解 #### 一、水晶报表简介 水晶报表(Crystal Reports)是一款功能强大的报表设计与生成工具,广泛应用于多种开发环境之中。对于Java开发者来说,通过集成Crystal Reports及其Java Reporting ...
通过本案例的学习,学生不仅掌握了如何使用`jExcelAPI`组件来动态生成Excel文件,还学会了如何将此功能集成到Java Web应用中。此外,结合数据库访问技术,还可以进一步扩展其功能,例如从数据库中获取数据并生成报表...
总之,JXL报表制作工具是Java开发者在处理Excel任务时的强大助手,通过掌握其核心功能和使用技巧,可以有效地提高工作效率,满足多样化的需求。在实际项目中,结合合理的编程实践和错误处理机制,可以充分发挥JXL的...
在提供的压缩包“导出excel架包”中,可能包含了JXL库的jar文件和其他相关示例代码或文档,这些资源可以帮助初学者快速理解和使用JXL进行Excel文件操作。通过学习和实践,开发者可以熟练掌握这一工具,提高在Java...
`ExcelUtils` 类是该案例中的核心类,负责Excel文件的生成。该类提供了一个构造函数,用于初始化导出过程中需要用到的各种参数。 ##### 构造函数 ```java public ExcelUtils(String tableBindingName, String ...
8. **源码解析**:博客链接<https://nethub2.iteye.com/blog/2225258> 提供了一个具体的`export.jsp`实现案例,通过阅读源码,我们可以了解到实际的编程细节,如如何设置HTTP响应头,如何使用POI库生成Excel文件等。...
标题中的"POI和easyexcel详解实战.zip"指的是一个包含有关Apache POI和EasyExcel的详细教程或案例的压缩文件。这两个工具都是Java库,专门用于处理Microsoft Office格式的文件,尤其是Excel电子表格。 Apache POI是...