两年前曾实现做过导出excel表格,由于当年缺少一种代码积累意识,于是乎跟很多人一样代码实现后就给弃之九霄,凑巧如今又使用了这么一个功能,等于又重新开始了一段初学的历程. 声明:以下代码均是小弟参考其他大神资料整理而来。建议阅读时根据先后顺序
附上导出结果:
一、Java实现Excel导出的方式有哪些
目前常见读写Excel的工具类开源javaAPI有两种方式,
一个是JXL(Java Excel API) 官网地址:http://jexcelapi.sourceforge.net/
一个是Apache的POI(Poor Obfuscation Implementation)官网地址:http://poi.apache.org/
由于我是使用的POI,所以这里较为注重POI导出资料的整理,另鉴于轮组不要胡乱造,况且新造的轮子不一定有旧的好,故此处搬出自己学习的技术博客出处
java中导入、导出execl http://blog.csdn.net/jerehedu/article/details/45195359
注:很简单明了的一个教程,可以让你简单快速的进行代码开发等。
java读写execl之POI超入门 http://rensanning.iteye.com/blog/1538591
注:此为详细篇,基本常用的都已包含. 基础execl格式以满足.
poi中常用的api http://blog.csdn.net/u011182715/article/details/51473618
注:一些api的补充.
以上三篇,可以说包含了大部分的poi资料. 一般情况下够用,至少我就是参考以上例子完成酱.
二、代码功能实现
铺垫了酱么多,说白了还是一样一样的,这里就简单附上一下个人代码的实现,首先肯定了先要加jar包,插件嘛,少了关键点怎么行呢,就比如咱们去大保健,钱都没带那不是迟早要粗事吖~
1.加入jar包.
自己下载自己加 http://download.csdn.net/detail/dcb_ripple/9790774
2.main代码实现
package jakarta;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFAnchor;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.ss.util.CellRangeAddress;
public class JakartaTest {
public static void main(String[] args) {
//web对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建表头等
HSSFSheet sheet = wb.createSheet("test1");
//创建行
HSSFRow row = sheet.createRow(0);
//创建列
HSSFCell cell = row.createCell(0);
HSSFCell cell2 = row.createCell(2);
cell2.setCellValue("嗯哼");
cell.setCellValue("我是写入的值");
sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));
try {
FileOutputStream output = new FileOutputStream("E:\\JAKARTA.xls");
wb.write(output);
output.flush();
System.out.println("成功创建excel文件");
} catch (Exception e) {
e.printStackTrace();
}
}
}
经测试. 运行即可完成execl创建,其实可以理解为是java 通过POI插件创建了一个EXECL文件而已.
3.通过浏览器实现导出
其实上面教程已经有讲怎么样通过控制器Controller导出
public void exportInfo(){
try {
String myId = getRequest().getParameter("myId");
MyOrder my = endOrderService.getMyOrderMyId(myId); //订单信息
List mylist = endOrderService.getOrderInfos(myId); //订单产品详情
if(my!=null || mylist!=null){
//web对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建表头等
HSSFSheet sheet = wb.createSheet(my.getOrder_title());
//省略省略/....
//以下是关键
HttpServletResponse response = ServletActionContext.getResponse();
response.reset();
OutputStream output = getRepsonse().getOutputStream();
response.setHeader("Content-disposition", "attachment; filename=Info.xls");
response.setContentType("application/msexcel");
wb.write(output);
output.close();
System.out.println("成功创建excel文件");
}
}catch (Exception e) {
e.printStackTrace();
}
}
Struts2框架,这里是通过了输出流OutputStream完成对文件的创建,这里要避免可能出现的Exception,即输出流重复创建或者输出流与struts2方法返回冲突。
概要; http://blog.csdn.net/dcb_ripple/article/details/62422440
代码实例.
/**
* 导出订单信息.
* @author 邓成波
* @date 创建时间 2017年3月16日 下午12:04:31
* @return
*/
public void exportInfo(){
try {
String myId = getRequest().getParameter("myId");
MyOrder my = endOrderService.getMyOrderMyId(myId); //订单信息
List mylist = endOrderService.getOrderInfos(myId); //订单产品详情
if(my!=null || mylist!=null){
//web对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建表头等
HSSFSheet sheet = wb.createSheet(my.getOrder_title());
// 用于格式化单元格的数据
HSSFDataFormat format = wb.createDataFormat();
// 设置字体 (上方标题用 填写内容)
HSSFFont font = wb.createFont();
font.setFontHeightInPoints((short) 11); //字体高度
font.setColor(HSSFFont.COLOR_NORMAL); //字体颜色
font.setFontName("宋体"); //字体
//表头主数据,加粗
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setFont(font);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平布局:居中
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//单元格垂直居中
cellStyle.setWrapText(true);//换行
// 设置字体 (上方标题用 导航头加粗)
HSSFFont fontBold = wb.createFont();
fontBold.setFontHeightInPoints((short) 11); //字体高度
//setHSSFPalette("#3366FF",7,wb);//自定义设置字体颜色
fontBold.setColor(HSSFFont.COLOR_NORMAL); //字体颜色
fontBold.setFontName("宋体"); //字体
fontBold.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 设置单元格类型
HSSFCellStyle cellStyleBold = wb.createCellStyle();
cellStyleBold.setFont(fontBold);
cellStyleBold.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平布局:居中
cellStyleBold.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//单元格垂直居中
cellStyleBold.setWrapText(true);//换行
ArrayList list = new ArrayList();
//rowNmae名称
String[] rowsName1 = new String[]{"合同流水号:","","机构:",""+my.getCompany()+"", "客户名称:",""+my.getClient_name()+"","出货批次:",""+my.getBatch()+""};
String[] rowsName2 = new String[]{"合同号:","","负责人:",""+my.getPrincipal()+"", "项目名称:",""+my.getProject_name()+"","收货人:",""+my.getReceipt_name()+""};
list.add(rowsName1);
list.add(rowsName2);
String[] rowsName3 = new String[]{"erp编号","产品名称","型号","识别号","颜色","数量","合同单价","金额小计"};
list.add(rowsName3);
sheet.setDefaultColumnWidth(15);//设置列默认的宽度
//sheet.setDefaultRowHeight((short) 1.5); //设置默认列高度
for (int i = 0; i < list.size(); i++) {
HSSFRow row = null;
if(i==2){
row = sheet.createRow(3);
}else{
row = sheet.createRow(i);
}
row.setHeightInPoints(17);//设置字体大小
String[] rowsName = list.get(i);
for(int c = 0;c dataList = new ArrayList();
Object[] objs = null;
for (int i = 0; i < mylist.size(); i++) {
MyOrderProductBean mybean = mylist.get(i);
objs = new Object[rowsName3.length];
objs[0] = mybean.getProduct_id(); //erp编号
objs[1] = mybean.getSort_Name(); //产品名称
objs[2] = mybean.getTypeName(); //产品类型名称
objs[3] = mybean.getIdentify(); //识别号 id
objs[4] = mybean.getColor(); //颜色
objs[5] = mybean.getCount(); //数量
objs[6] = mybean.getClinch_money(); //合同单价
objs[7] = mybean.getClinch_money_sum(); //金额小计
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//String date = df.format(man.getModiDate());
dataList.add(objs);
}
for(int i = 0; i < dataList.size(); i++) {
HSSFRow row =sheet.createRow(i+4);
Object[] objsRow = dataList.get(i);
int length = 0;
for (int j = 0; j < objsRow.length; j++) {
HSSFCell cell = row.createCell(j);
if(objsRow[j]!=null && !objsRow[j].toString().isEmpty()){
if(objsRow[j].toString().length()>length){
//获取本列最高的字符长度
length = objsRow[j].toString().length();
}
cell.setCellValue(objsRow[j].toString());
}
cell.setCellStyle(getStyle(wb));
}
//某列字数太多换行 暂时不要
/*if(length>9){
row.setHeight((short)((length%9)*265)); //这里的265代表一个字的高度
}*/
}
//价格合计及说明.
HSSFRow row =sheet.createRow(dataList.size()+4);
HSSFCell cell = row.createCell(0);
cell.setCellStyle(getStyle(wb));
HSSFCell cell2 = row.createCell(1);
cell2.setCellValue("合计:");
cell2.setCellStyle(getStyle(wb));
row.createCell(2).setCellStyle(getStyle(wb));
row.createCell(3).setCellStyle(getStyle(wb));
row.createCell(4).setCellStyle(getStyle(wb));
row.createCell(5).setCellStyle(getStyle(wb));
row.createCell(6).setCellStyle(getStyle(wb));
HSSFCell cell3 = row.createCell(7);
cell3.setCellValue(my.getTotal_money());
cell3.setCellStyle(getStyleTitle(wb));
sheet.addMergedRegion(new CellRangeAddress(dataList.size()+4,dataList.size()+4,1,6));
// 表格说明列
HSSFRow rowContext =sheet.createRow(dataList.size()+5);
HSSFCell cellContext = rowContext.createCell(0);
cellContext.setCellValue("说明:");
cellContext.setCellStyle(getStyle(wb));
HSSFCell cellContext2 = rowContext.createCell(1);
cellContext2.setCellValue(my.getOrder_desc());
cellContext2.setCellStyle(getStyle(wb));
rowContext.createCell(2).setCellStyle(getStyle(wb));
rowContext.createCell(3).setCellStyle(getStyle(wb));
rowContext.createCell(4).setCellStyle(getStyle(wb));
rowContext.createCell(5).setCellStyle(getStyle(wb));
rowContext.createCell(6).setCellStyle(getStyle(wb));
rowContext.createCell(7).setCellStyle(getStyle(wb));
sheet.addMergedRegion(new CellRangeAddress(dataList.size()+5,dataList.size()+5,1,7));
sheet.autoSizeColumn((short)0); //调整第一列宽度
sheet.autoSizeColumn((short)1); //调整第二列宽度
sheet.autoSizeColumn((short)2);
sheet.autoSizeColumn((short)3);
sheet.autoSizeColumn((short)4);
sheet.autoSizeColumn((short)5);
sheet.autoSizeColumn((short)6);
sheet.autoSizeColumn((short)7);
//sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); //合并列
HttpServletResponse response = ServletActionContext.getResponse();
response.reset();
OutputStream output = getRepsonse().getOutputStream();
response.setHeader("Content-disposition", "attachment; filename=Info.xls");
response.setContentType("application/msexcel");
wb.write(output);
output.close();
System.out.println("成功创建excel文件");
}
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 列表数据格式
* @author 邓成波
* @date 创建时间 2017年3月21日 下午4:32:13
* @param workbook
* @return
*/
public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
// 设置字体
HSSFFont font = workbook.createFont();
//设置字体名字
font.setFontName("宋体"); //字体
//设置字体大小
font.setFontHeightInPoints((short)11);
//字体加粗
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置样式;
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(true);
//设置水平对齐的样式为居中对齐;
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
return style;
}
/**
* 列表表头用 数据格式表头
* @author 邓成波
* @date 创建时间 2017年3月21日下午4:32:13
* @param workbook
* @return
*/
public HSSFCellStyle getStyleTitle(HSSFWorkbook workbook) {
//设置字体
HSSFFont font = workbook.createFont();
//设置字体名字
font.setFontName("宋体"); //字体
//设置字体大小
font.setFontHeightInPoints((short)10);
//字体加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置样式;
HSSFCellStyle style = workbook.createCellStyle();
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setFillForegroundColor(IndexedColors.RED.getIndex());
style.setFillBackgroundColor(IndexedColors.RED.getIndex());
//设置底边框;
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;
}
/**
* 设定自定义字体颜色信息
* @author 邓成波
* @date 创建时间 2017年3月21日 下午12:01:09
* @param str 颜色
* @param index 编号
* @param wb execl对象
*/
public void setHSSFPalette(String str,int index,HSSFWorkbook wb){
//处理把它转换成十六进制并放入一个数
int[] color=new int[3];
color[0]=Integer.parseInt(str.substring(1, 3), 16);
color[1]=Integer.parseInt(str.substring(3, 5), 16);
color[2]=Integer.parseInt(str.substring(5, 7), 16);
//自定义颜色
HSSFPalette palette = wb.getCustomPalette();
//设置自定义颜色的下标,接下来会用到
palette.setColorAtIndex(((short) index),(byte)color[0], (byte)color[1], (byte)color[2]);
}
附加:导出表名中文乱码问题,从别处找到可用.
response.setHeader("Content-disposition", "attachment; filename=中文名称.xls");
//response.setContentType("application/msexcel");
response.setContentType("application/x-download");//下面三行是关键代码,处理乱码问题
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+new String(my.getOrder_title().getBytes("gbk"), "iso8859-1")+".xls");
代码有点乱,由于格式问题,比较臃肿,仅能做参考那种。至于为什么要这么用上面的三个已经介绍的比较详细》
一. POI设置自定义的字体颜色等,经测试可行,代码中未使用 注释掉了。
poi怎么使用自定义字体颜色 http://www.iteye.com/problems/42620
poi设置颜色和自定义颜色 http://blog.sina.com.cn/s/blog_b0d90e8c0102v3op.html
颜色索引对照表 http://blog.csdn.net/for_china2012/article/details/29844661
二.调整行宽及自适应及数据转
execl自动调整列宽 http://www.cnblogs.com/azhqiang/p/4111197.html
行高设置 http://blog.csdn.net/chinapi_hzh/article/details/5776119
公共导出execl的方法 http://blog.csdn.net/wangchangpen62/article/details/44410967
完。
嗯哼》》 不会告诉你这么点东西,整理下来弄一弄居然花了一个多小时. 宝宝心里苦