1。点击打开的IE浏览器窗口右上角的齿轮图标,选择“Internet选项”,如下图:
2。在打开的Internet选项窗口中,切换到安全栏,点击安全选项卡中的“自定义级别”,如下图:
3。在“安全设置-Internet区域”界面找到“Java Applet脚本”和“活动脚本”,将两个选项都选择“禁用”,然后点击确定,如下图:
热门频道
首页
博客
培训学院
VIP
APP
问答
下载
社区
推荐频道
活动
招聘
专题
打开CSDN APP
版权所有©1999-2020,www.sychzs.cn,保留所有权利
打开APP
大数据导出excel大小限制_java 导出Excel大数据量,总结一下自己的经验!原创
2020-12-19 01:58:16
weixin_39655377
5 年编码经验
关注
分析并导出实现代码,XLSX支持:
/*** 生成XLSX,2007版本的excel,每张sheet没有6.5W行的限制,但是达到一定数量时,内存可能会溢出,
* 此方法适合预计数据导出小于10W时使用。在本机上测试,可以输出14W。列数约为8
*
*@paramfileOut
* 输出流
*@paramsheetMap
* 待设置的数据信息
*@throwsSQLException*/
public static voidcreateXSLXByResultSet(OutputStream fileOut, WriteXLSBean... beans) throwsSQLException {try{//重点工作簿
工作簿 wb = newXSSFWorkbook();for (int i = 0, len = beans.length; i len; i++) {
WriteXLSBean xlsBean=beans[i];
工作表sheet=wb.createSheet(xlsBean.getSheetName());
ResultSet rs=xlsBean.getRs();
ResultSetMetaData rsmd=rs.getMetaData();
TypeHandlerRegistry tr=www.sychzs.cn;
Map th =xlsBean.getTh();int index = 0;while(www.sychzs.cn()) {long t1 =System.currentTimeMillis();
org.apache.poi.ss.usermodel.Row行=表
.createRow(index);for (int j = 0, numberOfColumns = rsmd.getColumnCount(); j numberOfColumns; j++) {
String key= rsmd.getColumnLabel(j + 1).toLowerCase();if(th.containsKey(key)) {
TypeHandler 类型 =tr.getTypeHandler(JdbcType
.forCode(rsmd.getColumnType(j+ 1)));
对象 obj=type.getResult(rs, key);
row.createCell(j).setCellValue(obj== null ? "": obj.toString());
}
}
System.out.println(index+ " :"
+ (System.currentTimeMillis() -t1));
索引++;
}
}//要点练习册
wb.write(fileOut);
}catch(IOException e) {
e.printStackTrace(); throw new ServiceRunTimeException("生产xls文档错误", e);
}终于{
}
}
上面标记的两个关键点是:
1。构建 Excel 对象
2。将对象写入 OutPutStream
在构建过程中,没有地方可以写入OutPutSteam,这意味着必须将整个Excel构建在内存中才能执行写入操作。在数据量很大的情况下,这会导致数据全部加载到内存中,而无法输出,导致最终内存溢出。
根据操作环境的不同,内存溢出可能会有所不同
视情况而定,如果数据量达到10W以上,建议使用
1。多个Excel,每个Excel有一个Sheet,因为所有Sheet都是Workbook的组件。如果不分开多个Excel,就算分开Sheets也没用,
2。每个Excel的列数适中,例如:每个Excel文件5万行,多次导出和分页查询的原理是一样的
3。将多个Excel导出到临时目录,通过程序压缩,然后提供给客户下载
2003版本将数据库结果保存到List中,然后生成:Table is List and Row is Map
/*** 制作xls,2003版excel,每张表行数限制为6.5W
*
*@paramfileOut
* 输出流,未关闭
*@paramsheetMap
* 要导出的数据信息*/
public static void createXSLByMap(OutputStream fileOut, MapsheetMap) {try{
HSSFWorkbook wb=newHSSFWorkbook();
设置键=sheetMap.keySet();for(Iterator迭代器=keys.iterator();迭代器
.hasNext();) {
String SheetKey=www.sychzs.cn();
工作表sheet=wb.createSheet(SheetKey);
列表sheetRows =sheetMap.get(SheetKey);for (int i = 0, len =sheetRows.size(); i len; i++) {
地图 cellMap =sheetRows.get(i);
设置cellSet =cellMap.keySet();
org.apache.poi.ss.usermodel.Row row=sheet.createRow(i);int j = 0;for (Iterator iterCell =cellSet.iterator(); iterCell
.hasNext(); j++) {
String cellKey=www.sychzs.cn();
对象 obj=cellMap.get(cellKey);
row.createCell(j).setCellValue(obj== null ? "": obj.toString());
}
}
}
wb.write(fileOut);
}catch(IOException e) {
e.printStackTrace();抛出 new ServiceRunTimeException("生产xls文档错误", e);
}终于{
}
}
新版POI+office 2007版excel可导出数十万项,不会内存溢出。详情请参阅:
在excel中导出大量数据到xlsx文件
静态字符串 src="abcdefafslfelgtryjukjhgfdadertjDSFGHJKJGHFERTUIOabcdefafslfelgtryjukjhgfdadertjDSFGHJKdertjDSFGHJKJGHFERTUIOabcdefafslfelgtryjukjhgfdadertjDSFGHJKJGHFERTUIO";
public static void main(String[] args) throwsThrowable {
SXSSFWorkbook wb = 新SXSSFWorkbook(100); //这里100是内存中的数字。如果大于这个数,就会写入硬盘,避免内存溢出
工作表 sh =wb.createSheet();
for (int rownum = 0; rownum 1000000; rownum++) {
行 row =sh.createRow(rownum);
for (int cellnum = 0; cellnum 10; cellnum++) {
Cell cell =row.createCell(cellnum);
字符串地址 = newCellReference(cell).formatAsString();
cell.setCellValue(地址+src.substring(rownum%10*10+1, (rownum%10+1)*10));
}
}
File file = new File("F:/aa.xlsx");
file.createNewFile();
FileOutputStream out = newFileOutputStream(文件);
wb.write(out);
out.close();
}
内存使用情况:
根据以上前辈的经验,我根据自己的需求集成了一个工具。解决了Excel表格.xls格式的65535行的限制。我实现的表单是导出一个多页的表格
(我一页有65000)
这里是使用反射来使用传入的实体的所有属性的值。这仅适用于String和基本数据类型。如果您有自己定义的类型,则需要自己添加它们。
packagecom.tommy.fundation.util;importjava.lang.reflect.Field;importjava.lang.reflect.InitationTargetException;importjava.lang.reflect.Method;importjava.util.ArrayList;www.sychzs.cn;importjava.util .List;public classRelectUtil {public static ListreflectEntity(T model,Class cals) throwsNoSuchMethodException、IllegalAccessException、IllegalArgumentException、InitationTargetException、SecurityException、NoSuchFieldException{
列表列表 = new ArrayList();
Field[] field= model.getClass().getDeclaredFields(); //获取实体类所有属性并返回Field数组
for(int j=0 ; j
String nam = field[j].getName(); //获取属性名称
字符串名称=nam;
name=name.substring(0,1).toUpperCase()+name.substring(1);
字符串类型= field[j].getGenericType().toString(); //获取属性类型
if(type.equals("class java.lang.String")){ //如果type是类类型,则前面包含“class”,后面是类名
方法 m = model.getClass().getMethod("get"+name);
字符串值= (String) m.invoke(model); //调用getter方法获取属性值
if(值!= null){
list.add(值);
}其他{
list.add("");
}
}if(type.equals("class java.lang.Integer")){
方法 m= model.getClass().getMethod("get"+name);
整数值=(整数) m.invoke(model);if(value != null){
list.add(值);
}其他{
list.add("");
}
}if(type.equals("class java.lang.Short")){
方法 m= model.getClass().getMethod("get"+name);
短值=(短) m.invoke(model);if(value != null){
list.add(值);
}其他{
list.add("");
}
}if(type.equals("class java.lang.Double")){
方法 m= model.getClass().getMethod("get"+name);
双值=(双)m.invoke(模型);if(值!= null){
list.add(值);
}其他{
list.add("");
}
}if(type.equals("class java.lang.Boolean")){
方法 m= model.getClass().getMethod("get"+name);
布尔值=(布尔) m.invoke(model);if(value != null){
list.add(值);
}其他{
list.add("");
}
}if(type.equals("class www.sychzs.cn")){
方法 m= model.getClass().getMethod("get"+name);
日期值=(日期) m.invoke(model);if(value != null){
list.add(值);
}其他{
list.add("");
}
}
}返回列表;
}
}
下面将是重点实现导出excel表
packagecom.tommy.fundation.util;importjava.io.OutputStream;importjava.util.ArrayList;www.sychzs.cn;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util .Map;导入java.util.Set;导入javax.servlet.http.HttpServletResponse;导入org.apache.poi.hssf.record.formula.functions.T;导入org.apache.poi.hssf.usermodel.HSSFRow;导入org.apache.poi .hssf.usermodel.HSSFSheet;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;
@SuppressWarnings("hiding")public class ExportExcel{/*** 导出多个excel表格,解决xls格式65535行的限制
*@authorOnlyOne
*@paramresponse
*@paramlist 需要处理的列表数据集合
*@throwsException*/@SuppressWarnings("弃用")public void doExcel(HttpServletResponse response,列表列表,字符串文件名) throwsException {
OutputStream os= response.getOutputStream();//获取输出流
response.reset();//设置下载头信息。 Content-disposition 是属性名称。附件是指以附件形式下载。如果想在页面上打开,就改成内联即可。 filename 是文件名
response.setHeader("内容处置", "附件; filename=excell.xls");
response.setContentType("application/msexcel");
地图sheetMap =daData(list);
HSSFWorkbook wb=newHSSFWorkbook();
设置键 =sheetMap.keySet();for (Iterator iterator =keys.iterator(); iterator.hasNext();) {
整数SheetKey=www.sychzs.cn();
HSSFSheet 表= wb.createSheet((fileName+SheetKey).toString());
列表sheetRows =sheetMap.get(SheetKey);for (int i = 0, len =sheetRows.size(); i len; i++) {
T en=(T)sheetRows.get(i);
List dataList = RelectUtil.reflectEntity(en, en.getClass());
HSSFRow row=sheet.createRow(i);
row.createCell(0).setCellValue(String.valueOf(i));for(int m=0; m
row.createCell(m+1).setCellValue(dataList.get(m).toString());
}
}
}
wb.write(os);
}/***此方法将数据集合按65000个进行分割成多个子集合
*@authorOnlyOne
*@paramlist 需要处理的列表数据集合
*@return
*/
public Map daData(Listlist){int count = list.size()/65000;int yu = list.size() % 65000;
Map map = new HashMap();for (int i = 0; i = count; i++) {
List subList = new ArrayList();if (i ==count) {
subList= list.subList(i * 65000, 65000 * i +yu);
}其他{
subList= list.subList(i * 65000, 65000 * (i + 1)-1);
}
map.put(i, subList);
}返回地图;
}
}
Java中如何调用
@RequestMapping(value = "/doExcel", method =RequestMethod.GET) public void doExcel(HttpServletResponse 响应,HttpServletRequest 请求) throwsException {
List list =enrolltgService.findAll();new ExportExcel().doExcel(response, list, "黑白淡奶");
}
干得好,你再也不用担心数据量太大而无法导出了! ! !
所需包poi-3.2-FINAL-20081019.jar
相关资源:poi读取大Excel文件,采用xml格式解析,测得50mb文件13s速度,可指定...
打开CSDN,获得更好的阅读体验
POI多线程分表导出百万级大数据量EXCEL导出_卓超的博客-CSDN博客...
从上面可以看出,Excel 2003及以下版本无法实现单张数据百万级。 ApachePOI 简介 Apache POI 是一个用 Java 编写的免费开源跨平台 JavaAPI。 Apache POI 为 Java 程序提供 API,用于读取和写入 Microsoft Office(Excel、WORD、PowerPoint、Visio 等)格式的文件...
Java使用POI导出数据到excel,单张和多张__铁路建设者的博客...
单张和多张使用的罐子是相同的。只需再创建一张表即可。以下是需要用到的jar包。您可以在相应模块的pom.xml中引入依赖groupIdorg。 apache.poi/groupId ...
java导出到excel超过65533行
业务背景:列表导出,如果数据导出超过65533行,解决方案: 1、如果数据导出超过65533行,系统直接提示:本系统支持的最大导出数量为65533行。 2.导出POI时将导出模板更改为.xlsx。使用XSSFWorkbook将所有数据获取到内存中。您可以导出超过 65533 行。然而上线后,你会发现内存会溢出。 3. 将导出模板更改为.xlsx。导出POI时使用SXSSFWorkbook,每次将一定量的数据放入内存。 ,导入后刷新,再次...
继续访问
Java poi导出的excel不能超过256列问题的解决方案
Java的poi导出的excel不能超过256列问题的解决方案。背景 1. 现状 2. 解决方案 背景 1. 现状。 Excel 文件名以 .xls 结尾。这个构造函数默认采用this.type这个类型。 = ExcelType.HSSF;公共 ExportParams(字符串标题, 字符串表名) { this.color = HSSFColorPredefined.WHITE.getIndex(); this.headerColor = HSSFC
继续访问
使用Apache POI导出excel(多sheet页)_我是鞠子静的博客
2。设置导出excel路径 //导出文件路径 String filePath="D:\\excel.xls"; 1 2 3. 创建Excel文件 //创建Excel文件(工作簿) HSSFWorkbook workbook = new HSSFWorkbook() ; 1 2 4. 设置单元格样式 //设置单元格样式 HSSFCel...
POI3.8导出大数据到excel(约50万条)_加糖咖啡_的博客_poi支持最多...
导入org.apache.poi.ss.usermodel.Sheet;导入 org.apache.poi.ss.usermodel.Workbook;导入 org.apache.poi.ss.util.CellReference;导入 org.apache.poi.xssf .streaming.SXSSFWorkbook; ...
最新发布【JAVA问题解决方案】01.EasyExcel导出数据超出Excel单表上限解决方案
1。找出单个Excel表格最多可以存储多少行数据(可以存储1,048,576条数据,1024的平方,2的20次方)。本文介绍EasyExcel导出数据超过Excel单表上限的解决方案。 2. 如果知道最大行数,则可以使用该数字作为条件。如果超过,则表将被分割。 3、分表时,需要划分数据,不要超过最大限制。实体类(很简单,导出表更快)
继续访问
Java实现流输出导出数据(使用EasyExcel)并打包成zip包
Java实现流输出格式文件下载,并将其打包为zip包。 pom.xml文件导入easyexcel依赖groupIdcom.alibaba/groupId artifactIdeasyexcel/artifactId version2.0.5/version /d...
继续访问
...转为excel文件(xls格式),附有实验结果(单张最多可有65536行)Fi...
使用POI导出MySQL数据库数据到excel文件(xls格式) 注:单张sheet最多可存储65536行!否则会报错!引起原因:java.lang.IllegalArgumentException:无效行号(65536)超出允许范围(0 ..65535)!
使用Apache POI导出百万EXCEL数据_橙乐果的博客
工作中,有一个需求:每天早上00:05定期从数据库中导出三个月以上的订单流水信息,并保存为excel文件。去做就对了。 1.引入POM依赖!-- excel -- !-- -- ...
Linux下读写文件操作
Linux下读写文件操作 #includestdio.h typedef struct Student { int no;字符名称[10];分数; }学生; int main(int args,char *argv[]) { //打开文件 FILE *fp=fopen("test.txt","w");如果(fp = NULL){ perror(“fopen”); ...
继续访问
Java导出大Excel文件,防止内存溢出
Java导出Excel大文件防止内存溢出 1.在Poi2中使用SXSSFWorkbook。将Poi引入maven3中。测试流程 4. 单元测试 Java 代码 5. 结论 导出业务数据到 Excel 表格,导出任务数据量比较大 当项目过大时,导出的项目会溢出内存。本文使用Java操作Poi的SXSSFWorkbook类导出来解决内存溢出问题。 1、在Poi中使用SXSSFWorkbook实现excel导出时,数据量过大时总是容易出现内存溢出的情况。可以使用POI提供的SXSSFWorkbook类来避免内存溢出
继续访问
Apache Poi导出Excel多Sheet页面详解!_奥鹏马博客
apache poi是目前常用的导出excel的方式。最近想实现一个导出多个excel表格的功能。我上网查了一下,大部分都是针对特定对象的导出,并不能实现任意对象的导出。现在我把我开发的代码贴出来供大家参考。 //注意:这里实现的关键是...
Apache poi 导出多表excel表格_彭太权的博客
导出多表Excel */public class ApachePoi { public static void main(String[] args) throws IOException { // TODO 自动生成方法存根 exportExcel();} @SuppressWarnings("resource") public static String导出Excel...
java导出excel限制大小_解决java poi导出excel2003不能超过65536行的问题
/*** 达到5万条数据时重新创建工作表的逻辑*/@Overridepublic void exportExcel(ListformList, ServletOutputStream outputStream){try{//工作表名称后面的数字,如表1 ,表2 int i = 0; //记录总行数 int rownum = 0; //记录每个sheet的行数 int tempnum = 0; //分页栏...
继续访问
热门推荐java poi导出Excel超大数据量解决方案
继续访问
poi导出到excel,实现一张excel多张表(可以解决poi导出限制65536的问题...
本文导出多张的excel实现是基于上一篇文章中POI导出的。拖了这么久,对上一篇文章中的POI做了一些优化。这里我只贴出修改方法的代码,其余的和上一篇文章一样。 /** * 导出Excel。在一页上单独导出Excel...
基于Apache POI实现(百万级)大数据量导出Excel_风中摇曳的水仙……
支持单个 excel 的 sheet 导出100w 的数据 ApachePOI操作Excel对象 1.HSSF:操作Excel 2007之前版本(.xls)格式,生成的EXCEL不经过压缩直接导出 2.XSSF:操作Excel 2007及之后版本(.xlsx)格式,内存占用高于HSSF ...
解决POI的XSSFWorkbook导入大excel的内存消耗过大问题
方式1:使用SXSSFWorkbook ,经过测试,这个情况无效,因为本质上SXSSFWorkbook 也是通过XSSFWorkbook来的,他可以解决写出excel的场景,但是解决不了我们这种用户上传且读取excel中的内容的场景 XSSFWorkbook XSSFWorkbook = new XSSFWorkbook(fileInputStream); System.gc(); SXSSFWorkbook SXSSFWorkbook = new SXSS
继续访问
导入导出
原文地址: 创建流程:(上级为 下级的载体) 1:.创建 工作簿 2.创建 sheet(可以创建多个) 3.创建行 4.创建单元格 接下来 分别说下 工作簿的常用三种形式的区别,他们分别是 1.HSSFWorkbook 2.XSSFWorkbook 3.SXSSFWork...
继续访问
NPOI导出Excel 65536限制
1 #region NPOI 导出excel数据超65535自动分表 2 /// summary 3 /// DataTable转换成Excel文档流,并输出到客户端 4 /// /summary 5 /// param name="table"...
继续访问
java导出csv文件 为解决导出excel时每个单元格的限制(32767)
此实现方法仅供参考 因为本人导出数据量不大所采取的方法 如数据量大,会到至内存溢出请知晓 在这还提下:导出时内容自己换行 只需在内容前尾各加双引号就行。 如图 1、准备导出工具类 // An highlighted block package com.test; import java.io.BufferedWriter; import java.io.File; import www.sychzs.cn...
继续访问
Excel单元格数据超过32767报错问题处理
java poi 32767
继续访问
SXSSFWorkbook Excel 大量数据导出
注意 SXSSFWorkbook 用于大量数据的导出 SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel, SXSSFWorkbook专门处理大数据,对于大型excel的创建且不会内存溢出的,就只SXSSFWorkbook了。 它的原理很简单,用硬盘空间换内存(就像hashmap用空间换时间一样)。 SXSSFWorkbook是streami...
继续访问
EXCEL大数据量导出的解决方案
将web页面上显示的报表导出到excel文件里是一种很常见的需求。然而,当数据量较大的情况下,excel本身的支持最多65535行数据的问题便凸显出来。下面就给出大数据量导出到excel的解决方 案。 首先,对于数据超过了65535行的问题,很自然的就会想到将整个数据分块,利用excel的多sheet页的功能,将超出65535行后的数据写入到下一个sheet页中,即通过多sheet页的方式,突破了...
继续访问
几行代码,复杂Excel 导入导出,真心强大!
点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达项目中使用:功能介绍IMPORT1、 ExcelHandle核心处理器;2、 ExcelWorkbookManageexcel所有工作表管理;3、 ExcelInitConfig配置文件初始化;4、 AbstractFileParser文件转换类;alanpoi import有何优势?1、 用户不需要额外引入poi...
继续访问
java中poi导出excel问题总结
java中poi导出excel问题总结
继续访问
java POI导出excel,列数限制在256列
有两篇文章写得比较好的
继续访问
apache poi导出excel最大多少个sheet
大数据导出excel大小限制
写评论
评论
收藏
点赞
踩
分享
Excel的两种导出入门方法(JAVA与JS)
最近在做一个小项目作为练手,其中使用到了导出到Excel表格,一开始做的是使用JAVA的POI导出的,但因为我的数据是爬虫爬出来的,数据暂时并不保存在数据库或后台,所以直接显示在HTML的table,需要下载时又要将数据传回后台然后生成Excel文件,最后再从服务器下载到本地,过程几度经过网络传输,感觉比较耗时与浪费性能,于是想着在HTML中的Table直接导到Excel中节约资源
JAVA导出EXCEL(.xls)
导出Excel用的插件是apache的poi.jar,maven地址如下
dependency
groupIdorg.apache.poi/groupId
artifactIdpoi/artifactId
version3.17/version/dependency
1. 简单应用
先来个简化无样式的Excel导出,由于我的数据存在JSON中,所以形参是JSONArray,朋友们根据自己的实际数据类型(Map,List,Set等)传入即可 ,代码如下
/**
* 创建excel并填入数据
* @author LiQuanhui
* @date 2017年11月24日 下午5:25:13
* @param head 数据头
* @param body 主体数据
* @return HSSFWorkbook
*/
public static HSSFWorkbook expExcel(JSONArray head, JSONArray body) { //创建一个excel工作簿
HSSFWorkbook workbook = new HSSFWorkbook(); //创建一个sheet工作表
HSSFSheet sheet = workbook.createSheet("学生信息");
//创建第0行表头,再在这行里在创建单元格,并赋值
HSSFRow row = sheet.createRow(0);
HSSFCell cell = null; for (int i = 0; i head.size(); i++) {
cell = row.createCell(i);
cell.setCellValue(head.getString(i));//设置值
}
//将主体数据填入Excel中
for (int i = 0, isize = body.size(); i isize; i++) {
row = sheet.createRow(i + 1);
JSONArray stuInfo = body.getJSONArray(i); for (int j = 0, jsize = stuInfo.size(); j jsize; j++) {
cell = row.createCell(j);
cell.setCellValue(stuInfo.getString(j));//设置值
}
} return workbook;
}
创建好Excel对象并填好值后(就是得到workbook),就是将这个对象以文件流的形式输出到本地上去,代码如下
/**
* 文件输出
* @author LiQuanhui
* @date 2017年11月24日 下午5:26:23
* @param workbook 填充好的workbook
* @param path 存放的位置
*/
public static void outFile(HSSFWorkbook workbook,String path) {
OutputStream os=null; try {
os = new FileOutputStream(new File(path));
workbook.write(os);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
至此Excel的导出其实已经做完了。
2. 添加样式后导出
但通常这并不能满足我们的需求,因为通常是需要设置Excel的一些样式的,如字体、居中等等,设置单元格样式主要用到这个类(HSSFCellStyle)
HSSFCellStyle cellStyle = workbook.createCellStyle();
现在说说HSSFCellStyle都能干些什么
HSSFCellStyle cellStyle = workbook.createCellStyle();//创建单元格样式对象1.设置字体
HSSFFont font = workbook.createFont(); //font.setFontHeight((short)12);//这个设置字体会很大
font.setFontHeightInPoints((short)12);//这才是我们平常在Excel设置字体的值
font.setFontName("黑体");//字体:宋体、华文行楷等等
cellStyle.setFont(font);//将该字体设置进去2.设置对齐方式
cellStyle.setAlignment(horizontalAlignment);//horizontalAlignment参考下面给出的参数
//以下是最常用的三种对齐分别是居中,居左,居右,其余的写代码的时候按提示工具查看即可
www.sychzs.cn
HorizontalAlignment.LEFT
HorizontalAlignment.RIGHT3.设置边框
cellStyle.setBorderBottom(border); // 下边框
cellStyle.setBorderLeft(border);// 左边框
cellStyle.setBorderTop(border);// 上边框
cellStyle.setBorderRight(border);// 右边框
//border的常用参数如下
BorderStyle.NONE 无边框
BorderStyle.THIN 细边框
BorderStyle.MEDIUM 中等粗边框
BorderStyle.THICK 粗边框//其余的我也描述不清是什么形状,有兴趣的到时可以直接测试
在经过一系列的添加样式之后,最后就会给单元格设置样式
cell.setCellStyle(cellStyle);
3. 自动调整列宽
sheet.autoSizeColumn(i);//i为第几列,需要全文都单元格居中的话,需要遍历所有的列数
4. 完整的案例
public class ExcelUtils { /**
* 创建excel并填入数据
* @author LiQuanhui
* @date 2017年11月24日 下午5:25:13
* @param head 数据头
* @param body 主体数据
* @return HSSFWorkbook
*/
public static HSSFWorkbook expExcel(JSONArray head, JSONArray body) {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("学生信息");
HSSFRow row = sheet.createRow(0);
HSSFCell cell = null;
HSSFCellStyle cellStyle = workbook.createCellStyle();
setBorderStyle(cellStyle, BorderStyle.THIN);
cellStyle.setFont(setFontStyle(workbook, "黑体", (short) 14));
cellStyle.setAlignment(www.sychzs.cn);
for (int i = 0; i head.size(); i++) {
cell = row.createCell(i);
cell.setCellValue(head.getString(i));
cell.setCellStyle(cellStyle);
}
HSSFCellStyle cellStyle2 = workbook.createCellStyle();
setBorderStyle(cellStyle2, BorderStyle.THIN);
cellStyle2.setFont(setFontStyle(workbook, "宋体", (short) 12));
cellStyle2.setAlignment(www.sychzs.cn); for (int i = 0, isize = body.size(); i isize; i++) {
row = sheet.createRow(i + 1);
JSONArray stuInfo = body.getJSONArray(i); for (int j = 0, jsize = stuInfo.size(); j jsize; j++) {
cell = row.createCell(j);
cell.setCellValue(stuInfo.getString(j));
cell.setCellStyle(cellStyle2);
}
} for (int i = 0, isize = head.size(); i isize; i++) {
sheet.autoSizeColumn(i);
} return workbook;
} /**
* 文件输出
* @author LiQuanhui
* @date 2017年11月24日 下午5:26:23
* @param workbook 填充好的workbook
* @param path 存放的位置
*/
public static void outFile(HSSFWorkbook workbook,String path) {
OutputStream os=null; try {
os = new FileOutputStream(new File(path));
workbook.write(os);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 设置字体样式
* @author LiQuanhui
* @date 2017年11月24日 下午3:27:03
* @param workbook 工作簿
* @param name 字体类型
* @param height 字体大小
* @return HSSFFont
*/
private static HSSFFont setFontStyle(HSSFWorkbook workbook, String name, short height) {
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints(height);
font.setFontName(name); return font;
} /**
* 设置单元格样式
* @author LiQuanhui
* @date 2017年11月24日 下午3:26:24
* @param workbook 工作簿
* @param border border样式
*/
private static void setBorderStyle(HSSFCellStyle cellStyle, BorderStyle border) {
cellStyle.setBorderBottom(border); // 下边框
cellStyle.setBorderLeft(border);// 左边框
cellStyle.setBorderTop(border);// 上边框
cellStyle.setBorderRight(border);// 右边框
}
}
POI的功能其实还是很强大的,这里只介绍了Excel的一丁点皮毛给入门的查看,如果想对Excel进行更多的设置可以查看下面的这篇文章,有着大量的使用说明。
空谷幽澜的POI使用详解
JS导出EXCEL(.xls)
java的Excel导出提供了强大的功能,但也对服务器造成了一定资源消耗,若能使用客户端的资源那真是太好了
1. 简单应用
JS的导出Excel非常简单,只需要引用Jquery和tableExport.js并设置一个属性即可
script src="%=basePath%/static/js/tableExport.js" type="text/javascript"/scriptscript type="text/javascript"
function exportExcelWithJS(){ //获取要导出Excel的表格对象并设置tableExport方法,设置导出类型type为excel
$('#tableId').tableExport({ type:'excel'
});
}/scriptbutton class="btn btn-primary" type="button" style="float: right;" onclick="exportExcelWithJS()"下载本表格/button
JS的导出就完成了,是不是特别简单
2. 进阶应用
但上面仅仅是个简单的全表无样式的导出
这tableExport.js还有一些其他功能,忽略行,忽略列,设置样式等,属性如下
script type="text/javascript"
function exportExcelWithJS(){ //获取要导出Excel的表格对象并设置tableExport方法,设置导出类型type为excel
$('#tableId').tableExport({ type:'excel',//导出为excel
fileName:'2017工资表',//文件名
worksheetName:'11月工资',//sheet表的名字
ignoreColumn:[0,1,2],//忽略的列,从0开始算
ignoreRow:[2,4,5],//忽略的行,从0开始算
excelstyles:['text-align']//使用样式,不用填值只写属性,值读取的是html中的
});
}/script
如上既是JS的进阶导出,操作简单,容易上手
但有个弊端就是分页的情况下,只能导出分页出的数据,毕竟这就是导出HTML内TABLE有的东西,数据在数据库或后台的也就无能为力,所以这个适合的是无分页的TABLE导出
3. 额外说明
tableExport.js是gitHub上的hhurz大牛的一个开源项目,需要下载该JS的可以点击链接进入gitHub下载或在我的百度网盘下载 密码:oafu
tableExport.js不仅仅是个导出Excel的JS,他还可以导出CSV、DOC、JSON、PDF、PNG、SQL、TSV、TXT、XLS (Excel 2000 HTML format)、XLSX (Excel 2007 Office Open XML format)、XML (Excel 2003 XML Spreadsheet format)、XML (Raw xml)多种格式,具体使用可以参考hhurz的使用介绍
本人在之前找了好几个导出Excel的都有各种各样的问题(乱码,无响应,无样式),这个是目前找到最好的一个了,能解决乱码问题,能有样式,非常强大
项目功能里要求能够将展示的报表导出excel,因为报表的数据都是动态从list传进来的,所以使用了POI技术来动态构建excel文件。
百科里说POI是介个样子的
“ApachePOI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对MicrosoftOffice格式档案读和写的功能”
简单来说就是通过它的API可以进行创建/读取文档,sheet,行列单元格等操作,也可以设置文档的各个样式。
刚接触这个任务的时候查了很多资料,最后主要是参考了这篇文章,程序复制粘贴就跑得通,对POI的整个理解可以得到很好地提升。
详解JAVA POI导出EXCEL报表的操作(包括各种格式及样式的实现)
然后参考着就实现了项目里要求的样子啦
=======================================================
百科中的示例附上作为下次使用的备忘。
创建Excel 文档
示例1将演示如何利用Jakarta POI API 创建Excel 文档。
示例1程序如下:
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java .io.FileOutputStream;
public class CreateXL {
/** Excel 文件要存放的位置,假定在D盘下*/
public static String outputFile="D:\test.xls";
public static void main(String argv[]){
try{
// 创建新的Excel 工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 在Excel工作簿中建一工作表,其名为缺省值
// 如要新建一名为"效益指标"的工作表,其语句为:
// HSSFSheet sheet = workbook.createSheet("效益指标");
HSSFSheet sheet = workbook.createSheet();
// 在索引0的位置创建行(最顶端的行)
HSSFRow row = sheet.createRow((short)0);
//在索引0的位置创建单元格(左上端)
HSSFCell cell = row.createCell((short) 0);
// 定义单元格为字符串类型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
// 在单元格中输入一些内容
cell.setCellValue("增加值");
// 新建一输出文件流
FileOutputStream fOut = new FileOutputStream(outputFile);
// 把相应的Excel 工作簿存盘
workbook.write(fOut);
fOut.flush();
// 操作结束,关闭文件
fOut.close();
System.out.println("文件生成...");
}catch(Exception e) {
System.out.println("已运行 xlCreate() : " + e );
}
}
}
读取Excel文档中的数据
示例2将演示如何读取Excel文档中的数据。假定在D盘JTest目录下有一个文件名为test1.xls的Excel文件。
示例2程序如下:
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java .io.FileInputStream;
public class ReadXL {
/** Excel文件的存放位置。注意是正斜线*/
public static String fileToBeRead="D:\test1.xls";
public static void main(String argv[]){
try{
// 创建对Excel工作簿文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));
// 创建对工作表的引用。
// 本例是按名引用(让我们假定那张表有着缺省名"Sheet1")
HSSFSheet sheet = workbook.getSheet("Sheet1");
// 也可用getSheetAt(int index)按索引引用,
// 在Excel文档中,第一张工作表的缺省索引是0,
// 其语句为:HSSFSheet sheet = workbook.getSheetAt(0);
// 读取左上端单元
HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.getCell((short)0);
// 输出单元内容,cell.getStringCellValue()就是取所在单元的值
System.out.println("左上端单元是: " + cell.getStringCellValue());
}catch(Exception e) {
System.out.println("已运行xlRead() : " + e );
}
}
}
设置单元格格式
在这里,我们将只介绍一些和格式设置有关的语句,我们假定workbook就是对一个工作簿的引用。在Java中,第一步要做的就是创建和设置 字体和单元格的格式,然后再应用这些格式:
1、创建字体,设置其为红色、粗体:
HSSFFont font = workbook.createFont();
font.setColor(HSSFFont.COLOR_RED);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
2、创建格式
HSSFCellStyle cellStyle= workbook.createCellStyle();
cellStyle.setFont(font);
3、应用格式
HSSFCell cell = row.createCell((short) 0);
cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue("标题 ");
处理WORD文档
import java .io.*;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
public class TestPoi {
public TestPoi() {
}
public static void main(String args[]) throws Exception
{
FileInputStream in = new FileInputStream ("D:\a.doc");
WordExtractor extractor = new WordExtractor();
String str = extractor.extractText(in);
//System.out.println("the result length is"+str.length());
System.out.println(str);
}
}
搜集链接 方便以后查阅
POI操作Excel常用方法总结
自己封装的poi操作excel工具类
两个原因:
1.你的excel模版本身有问题,可以尝试新建一个模版。
2.你的excel使用了一些POI不支持的函数。
解决办法:
另存是由excel重写了完整的文件,可以解决问题。
关闭文件例子:
FileOutputStream os = new FileOutputStream("workbook.xls");
wb.write(os);
os.close();
在保护状态下execl的格式有可能正在被使用,你这边修改,准确说是线程冲突,一般excel值会作为导出文件的模板,是不会编辑的。你可以在读的时候判断execl是否正在被使用。
下面的代码问题,你可以参考
package com.hwt.glmf.common;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
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.CellRangeAddress;
import org.apache.poi.hssf.util.HSSFColor;
/**
* 导出Excel公共方法
* @version 1.0
*
* @author wangcp
*
*/
public class ExportExcel extends BaseAction {
//显示的导出表的标题
private String title;
//导出表的列名
private String[] rowName ;
private ListObject[] dataList = new ArrayListObject[]();
HttpServletResponse response;
//构造方法,传入要导出的数据
public ExportExcel(String title,String[] rowName,ListObject[] dataList){
this.dataList = dataList;
this.rowName = rowName;
this.title = title;
}
/*
* 导出数据
* */
public void export() throws Exception{
try{
HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象
HSSFSheet sheet = workbook.createSheet(title); // 创建工作表
// 产生表格标题行
HSSFRow rowm = sheet.createRow(0);
HSSFCell cellTiltle = rowm.createCell(0);
//sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面 - 可扩展】
HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);//获取列头样式对象
HSSFCellStyle style = this.getStyle(workbook); //单元格样式对象
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (rowName.length-1)));
cellTiltle.setCellStyle(columnTopStyle);
cellTiltle.setCellValue(title);
// 定义所需列数
int columnNum = rowName.length;
HSSFRow rowRowName = sheet.createRow(2); // 在索引2的位置创建行(最顶端的行开始的第二行)
// 将列头设置到sheet的单元格中
for(int n=0;ncolumnNum;n++){
HSSFCell cellRowName = rowRowName.createCell(n); //创建列头对应个数的单元格
cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); //设置列头单元格的数据类型
HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
cellRowName.setCellValue(text); //设置列头单元格的值
cellRowName.setCellStyle(columnTopStyle); //设置列头单元格样式
}
//将查询出的数据设置到sheet对应的单元格中
for(int i=0;idataList.size();i++){
Object[] obj = dataList.get(i);//遍历每个对象
HSSFRow row = sheet.createRow(i+3);//创建所需的行数
for(int j=0; jobj.length; j++){
HSSFCell cell = null; //设置单元格的数据类型
if(j == 0){
cell = row.createCell(j,HSSFCell.CELL_TYPE_NUMERIC);
cell.setCellValue(i+1);
}else{
cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);
if(!"".equals(obj[j]) obj[j] != null){
cell.setCellValue(obj[j].toString()); //设置单元格的值
}
}
cell.setCellStyle(style); //设置单元格样式
}
}
//让列宽随着导出的列长自动适应
for (int colNum = 0; colNum columnNum; colNum++) {
int columnWidth = sheet.getColumnWidth(colNum) / 256;
for (int rowNum = 0; rowNum sheet.getLastRowNum(); rowNum++) {
HSSFRow currentRow;
//当前行未被使用过
if (sheet.getRow(rowNum) == null) {
currentRow = sheet.createRow(rowNum);
} else {
currentRow = sheet.getRow(rowNum);
}
if (currentRow.getCell(colNum) != null) {
HSSFCell currentCell = currentRow.getCell(colNum);
if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
int length = currentCell.getStringCellValue().getBytes().length;
if (columnWidth length) {
columnWidth = length;
}
}
}
}
if(colNum == 0){
sheet.setColumnWidth(colNum, (columnWidth-2) * 256);
}else{
sheet.setColumnWidth(colNum, (columnWidth+4) * 256);
}
}
if(workbook !=null){
try
{
String fileName = "Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
String headStr = "attachment; filename=\"" + fileName + "\"";
response = getResponse();
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", headStr);
OutputStream out = response.getOutputStream();
workbook.write(out);
}
catch (IOException e)
{
e.printStackTrace();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
/*
* 列头单元格样式
*/
public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
// 设置字体
HSSFFont font = workbook.createFont();
//设置字体大小
font.setFontHeightInPoints((short)11);
//字体加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置字体名字
font.setFontName("Courier New");
//设置样式;
HSSFCellStyle style = workbook.createCellStyle();
//设置底边框;
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//设置底边框颜色;
style.setBottomBorderColor(HSSFColor.BLACK.index);
//设置左边框;
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//设置左边框颜色;
style.setLeftBorderColor(HSSFColor.BLACK.index);
//设置右边框;
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
//设置右边框颜色;
style.setRightBorderColor(HSSFColor.BLACK.index);
//设置顶边框;
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
//设置顶边框颜色;
style.setTopBorderColor(HSSFColor.BLACK.index);
//在样式用应用设置的字体;
style.setFont(font);
//设置自动换行;
style.setWrapText(false);
//设置水平对齐的样式为居中对齐;
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
/*
* 列数据信息单元格样式
*/
public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
// 设置字体
HSSFFont font = workbook.createFont();
//设置字体大小
//font.setFontHeightInPoints((short)10);
//字体加粗
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置字体名字
font.setFontName("Courier New");
//设置样式;
HSSFCellStyle style = workbook.createCellStyle();
//设置底边框;
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//设置底边框颜色;
style.setBottomBorderColor(HSSFColor.BLACK.index);
//设置左边框;
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//设置左边框颜色;
style.setLeftBorderColor(HSSFColor.BLACK.index);
//设置右边框;
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
//设置右边框颜色;
style.setRightBorderColor(HSSFColor.BLACK.index);
//设置顶边框;
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
//设置顶边框颜色;
style.setTopBorderColor(HSSFColor.BLACK.index);
//在样式用应用设置的字体;
style.setFont(font);
//设置自动换行;
style.setWrapText(false);
//设置水平对齐的样式为居中对齐;
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
}
在开始选项卡下面有个玩意叫自动换行,点一下就好了。
如果找不到,全选表格,右击,设置单元格格式,对齐,勾选自动换行即可。