poi excel mvc npoi导出excel添加宏

后使用快捷导航没有帐号?
『』『』『』
查看: 1469|回复: 3
使用POI导出Excel时,关于设置带有多行表头表格自动宽度的问题解决办法
本帖最后由 winnid 于
13:36 编辑
这个是我曾经再写Java项目 需要用到导出Excel 时解决的方案
这里作为资格认证用,应该可以吧
可能没多少含量。让大家见笑了
下面是原文
直接说吧!
sheet.autoSizeColumn((short)col, true);
只要这样写就解决了!
第一个参数是自动宽度的列数(第几列),第二个参数是说是否算上已经合并的单元格。
本来写的代码:
1 for (int col = 0; col & propIds.size(); col++) {
2& && && &sheet.autoSizeColumn((short)col);
3& && && &int maxColumnWidth = sheet.getColumnWidth(col);
4& && && &int width = 0;
5& && && &for (int i = 1; i &= headDeal. i++) {
6& && && && & if(sheet.getRow(i).getCell(col).getStringCellValue().length() != 0)
7& && && && & width = sheet.getRow(i).getCell(col).getStringCellValue().length() * 512;
8& && && &}
9& && && &maxColumnWidth = (maxColumnWidth&width) ? maxColumnWidth :
10& && && &sheet.setColumnWidth(col, maxColumnWidth);
12 System.out.println(&header rows: & + headDeal.rows);
中间的代码(第3到第10行)
(除第一行for循环和第二行sheet.autoSizeColumn((short)col); 之外),
就是我本来写的解决办法,功能同样能实现。
不过,算是白写了,poi原来自带一种方法的。
其中的 512 ,是因为中文在表格中被解析会占用512的宽度所致,数字和英文256。
结果看了源码才知道,原来poi自带有合并表格模式。
意思就是:poi对于合并表头的表格设计,在sheet.autoSizeColumn 有方法,第二个参数就是设置是否加入被合并的表格计算自动宽度。(true是加入,false不加,默认false)
有些懂有些不懂 去百度查查
有些懂有些不懂 去百度查查
有些懂有些不懂 去百度查查poi 导出Excel 工具类 - OPEN代码分享
import java.io.OutputS
import java.lang.reflect.M
import java.text.SimpleDateF
import java.util.C
import java.util.D
import java.util.regex.M
import java.util.regex.P
import org.apache.poi.hssf.usermodel.HSSFC
import org.apache.poi.hssf.usermodel.HSSFCellS
import org.apache.poi.hssf.usermodel.HSSFClientA
import org.apache.poi.hssf.usermodel.HSSFF
import org.apache.poi.hssf.usermodel.HSSFP
import org.apache.poi.hssf.usermodel.HSSFRichTextS
import org.apache.poi.hssf.usermodel.HSSFR
import org.apache.poi.hssf.usermodel.HSSFS
import org.apache.poi.hssf.usermodel.HSSFW
import org.apache.poi.hssf.util.HSSFC
import org.apache.poi.hssf.util.R
* @author Bruce Xu
* @param &T&
public class ExcelUtil&T& {
* 导出Excel的方法
* @param title excel中的sheet名称
* @param headers 表头
* @param result 结果集
* @param out 输出流
* @param pattern 时间格式
* @throws Exception
public void exportExcel(String title, String[] headers,String[] columns, Collection&T& result, OutputStream out, String pattern) throws Exception{
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为20个字节
sheet.setDefaultColumnWidth((short)20);
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setFillForegroundColor(HSSFColor.GOLD.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setColor(HSSFColor.VIOLET.index);
//font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
style.setFont(font);
// 指定当单元格内容显示不下时自动换行
style.setWrapText(true);
// 声明一个画图的顶级管理器
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
以下可以用于设置导出的数据的样式
// 生成并设置另一个样式
HSSFCellStyle style2 = workbook.createCellStyle();
style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 生成另一个字体
HSSFFont font2 = workbook.createFont();
font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
// 把字体应用到当前的样式
style2.setFont(font2);
// 声明一个画图的顶级管理器
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
// 定义注释的大小和位置,详见文档
HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
// 设置注释内容
comment.setString(new HSSFRichTextString(&可以在POI中添加注释!&));
// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
comment.setAuthor(&leno&);*/
// 产生表格标题行
//表头的样式
HSSFCellStyle titleStyle = workbook.createCellStyle();// 创建样式对象
titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);// 水平居中
titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
// 设置字体
HSSFFont titleFont = workbook.createFont(); // 创建字体对象
titleFont.setFontHeightInPoints((short) 15); // 设置字体大小
titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置粗体
titleFont.setFontName(&黑体&); // 设置为黑体字
titleStyle.setFont(titleFont);
sheet.addMergedRegion(new Region(0,(short)0,0,(short)(headers.length-1)));//指定合并区域
HSSFRow rowHeader = sheet.createRow(0);
HSSFCell cellHeader = rowHeader.createCell((short)0);
//只能往第一格子写数据,然后应用样式,就可以水平垂直居中
HSSFRichTextString textHeader = new HSSFRichTextString(title);
cellHeader.setCellStyle(titleStyle);
cellHeader.setCellValue(textHeader);
HSSFRow row = sheet.createRow(1);
for (int i = 0; i & headers. i++) {
HSSFCell cell = row.createCell((short)i);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
// 遍历集合数据,产生数据行
if(result != null){
int index = 2;
for(T t:result){
Field[] fields = t.getClass().getDeclaredFields();
row = sheet.createRow(index);
for(short i = 0; i & columns. i++) {
HSSFCell cell = row.createCell(i);
Field field = fields[i];
String fieldName = field.getName();
String fieldName = columns[i];
String getMethodName = &get&
+ fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Class tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName, new Class[]{});
// getMethod.getReturnType().isInstance(obj);
Object value = getMethod.invoke(t, new Class[]{});
String textValue =
if(value == null) {
textValue = &&;
}else if (value instanceof Date) {
Date date = (Date)
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
textValue = sdf.format(date);
else if (value instanceof byte[]) {
// 有图片时,设置行高为60
row.setHeightInPoints(60);
// 设置图片所在列宽度为80px,注意这里单位的一个换算
sheet.setColumnWidth(i, (short) (35.7 * 80));
// sheet.autoSizeColumn(i);
byte[] bsValue = (byte[])
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
, (short) 6, index, (short) 6, index);
anchor.setAnchorType(2);
patriarch.createPicture(anchor, workbook.addPicture(
bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
//其它数据类型都当作字符串简单处理
textValue = value.toString();
if(textValue!= null){
Pattern p = pile(&^//d+(//.//d+)?$&);
Matcher matcher = p.matcher(textValue);
if(matcher.matches()){
//是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
HSSFRichTextString richString = new HSSFRichTextString(textValue);
HSSFFont font3 = workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
workbook.write(out);
调用示例:以springmvc为例,导出数据库记录到Excel,弹出下载对话框
@RequestMapping(value=&/exprotExcel&)
public @ResponseBody String exprotExcel(HttpServletResponse response,NjWorkLog njWorkLog,@RequestParam(value=&createUserIds&,required=false) String createUserIds,@RequestParam(value=&workLogGrantUsersName&,required=false)String workLogGrantUsersName,@RequestParam(value=&strWorkEndDate&,required=false)String strWorkEndDate)
ExcelUtil&NjWorkLog& excelUtil=new ExcelUtil&NjWorkLog&();
OutputStream out=
out = response.getOutputStream();// 取得输出流
//out.flush();
response.reset();// 清空输出流
response.setHeader(&Content-disposition&, & filename=&+new String(&工作日志&.getBytes(&GB2312&),&8859_1&)+&.xls&);// 设定输出文件头
response.setContentType(&application/msexcel&);// 定义输出类型
catch (IOException e)
e.printStackTrace();
String[] headers ={&跟踪目标&,&工作时间&,&事项类型&,&项目名称&,&完成情况自述&,&工作量&,&进度&,&配合人员&,&加班&,&作者&,&附件名称&};
String[]columns={ &strTarget&, &strWorkDate&, &dictTypeId&, &projectId&, &strDesc&, &bdWorkload&, &strSchedule&, &strCooperate&,&isOverTime&,&createUserId&, &strFileName&};
if(&on&.equals(njWorkLog.getIsOverTime()))
njWorkLog.setIsOverTime(&1&);
njWorkLog.setIsOverTime(&&);
if(StringUtils.isNotBlank(createUserIds))
njWorkLog.setTempArray(createUserIds.split(&,&));
List&NjWorkLog& dataset=njWorkLogService.findMyAttentionExcel(njWorkLog);
excelUtil.exportExcel(&工作日志&, headers, columns, dataset, out, &&);
} catch (Exception e1)
e1.printStackTrace();
out.close();
} catch (IOException e)
e.printStackTrace();
&&您还没有登录,点击这里或之后才能回复!
浏览数: 298
分享时间: 5 个月 前14:49 提问
Java POI导出Excel并添加图片问题
现在要利用POI导出Excel报表,并且需要将一张图片一起导出到Excel中,请问有Java中有什么方法能将图片的背景变成透明的,因为图片本身是一个公章,客户想通过程序实现盖章,所以需要将公章的图片变成透明的然后导出到Excel中,这样就不回遮挡Excel本身的内容。谢谢了!
相关参考资料查看:2871|回复:9
最近做一个导入导出Excel的组件,用的是POI,做完后发现,如果导出格式为Excel2003,而数据量又非常大的情况下会报内存溢出异常,在网上找了下资料,发现解决办法都是导出多个EXCEL,然后打包或者追加sheet页。大家帮忙想想还有没有别的方法呢?
小洋(on my way)
导出CSV格式的试试。
51CTOjava板块讨论QQ群:【1000人群】2群:【可加】 & && && &欢迎热爱JAVA的来讨论^_^
我的个人网站--&
引用:原帖由 shyy8712872 于
09:43 发表
导出CSV格式的试试。 导出格式还必须为EXCEL
永不期待,永不假设,永不强求,顺其自然……
小洋(on my way)
引用:原帖由 yuke198907 于
09:54 发表
导出格式还必须为EXCEL 那没办法了,我一般项目超过5万条我就用CSV格式导出,内存没那么大。
51CTOjava板块讨论QQ群:【1000人群】2群:【可加】 & && && &欢迎热爱JAVA的来讨论^_^
我的个人网站--&
中级工程师
Just do it
excel装的数据有限的,好像是5W条还是多少。所以大数据的话是不行的。追加一个sheet应该可以考虑一下。
技术再好也入侵不了你的心,是我的技术不够高还是你的心没有打开的权限?
欢迎光临JAVA板块:&&
引用:原帖由 davenzeng 于
10:31 发表
excel装的数据有限的,好像是5W条还是多少。所以大数据的话是不行的。追加一个sheet应该可以考虑一下。 当导出的列多的时候,1万多条数据就不行了...
永不期待,永不假设,永不强求,顺其自然……
中级工程师
Just do it
引用:原帖由 yuke198907 于
10:34 发表
当导出的列多的时候,1万多条数据就不行了... 那就只有分多次导出或者是追加sheet了。我之前做过是经过筛选之后再导出的。不过筛选之后还是有这么多数据的话也是要换其他的方法的。
技术再好也入侵不了你的心,是我的技术不够高还是你的心没有打开的权限?
欢迎光临JAVA板块:&&
引用:原帖由 davenzeng 于
10:37 发表
那就只有分多次导出或者是追加sheet了。我之前做过是经过筛选之后再导出的。不过筛选之后还是有这么多数据的话也是要换其他的方法的。 嗯,我做的也是加筛选条件的,不过也得考虑数据量大的情况怎么办。
永不期待,永不假设,永不强求,顺其自然……
1、Excel2003导出一个sheet最多只能65535行
2、你用的是poi导出,如果数据量大且用户多,还是采用上面一些同学的说法导csv文本比较可靠
3、为什么不能使用Excel2007或者以上版本呢?这个版本采用xml结构,行数理论上是无上限的,并且能够采用POI的事件驱动模式来处理,能够很大程序缓解内存问题
并且poi官方是提供SXSSFWorkbook这个类,有个类似缓冲区的功能,利用硬盘空间来存储需要写的列,一年多以前我采用了这个方法处理一个导出功能,虽然能够解决问题,但从jconsole监控上看,内存使用情况也不怎么乐观,用户多了估计还是得顶不住,所以还是说服需求方使用其它格式比较好
本帖最后由 hiv_super 于
18:33 编辑
引用:原帖由 hiv_super 于
18:23 发表
1、Excel2003导出一个sheet最多只能65535行
2、你用的是poi导出,如果数据量大且用户多,还是采用上面一些同学的说法导csv文本比较可靠
3、为什么不能使用Excel2007或者以上版本呢?这个版本采用xml结构,行数理论上是无上限 ... 嗯,也有2007格式的,也有2003格式的,用户可以自己选择
永不期待,永不假设,永不强求,顺其自然……

我要回帖

更多关于 npoi导入导出excel 的文章

 

随机推荐