像在桌面手动创建表格一样,做一个共用のExcel导出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了像在桌面手动创建表格一样,做一个共用のExcel导出相关的知识,希望对你有一定的参考价值。
【前言】昔日龌龊不足夸,今朝放荡思无涯。
【思路】
我们在桌面上创建Excel的时候:
1、首先创建一个Excel也就是
//声明工作薄
HSSFWorkbook wb = new HSSFWorkbook();
2、接下来未页签sheet重命名,也就是
//sheet页签部分
HSSFSheet sheet = wb.createSheet("页签的名字");
3、规划一下有多少列,再起一个标题,也就是
//合并标题
sheet.addMergedRegion(new Region(0, (short)0, (short)0,(short)(规划的列数)));
4、创建一个表头,也就是
//创建表头
row = sheet.createRow(1);
5、循环插入表格,也就是加一个for循环
//第一层为循环创建行
for (int i = 0; i < contentLst.size(); i++) {
row = sheet.createRow(i+2);
row.setHeight((short) 550);
//第二层创建每行的单元格,并填内容
for (int j = 0; j < contentLst.get(i).length; j++) {
cell = row.createCell(j);
cell.setCellValue(String.valueOf(contentLst.get(i)[j]));
cell.setCellStyle(shstyle);
}
}
6、内容填完了,你不觉得有的字多有的字少,也就是列宽、行高有问题。怎么办呢?也就是
//创建标题
HSSFRow row = sheet.createRow(0);
//设置标题行高
row.setHeight((short) 行高数);
//自定义列宽部分,你将每个列宽作为参数传过来具体每列多宽得自己测试了。
if(liekuanLst != null && liekuanLst.size() > 0){
for (int i = 0; i < liekuanLst.size(); i++) {
sheet.setColumnWidth((short)i, liekuanLst.get(i));
}
}
7、内容填完了是不是好看,加点样式?也就是
//居中字体等样式区域
sheet.setHorizontallyCenter(true);
//主题
HSSFCellStyle titlefontshstyle = wb.createCellStyle();
HSSFFont titlefont = wb.createFont();
setcontentStyleTable(titlefontshstyle, titlefont, "黑体", 20, true, false);
public static void setcontentStyleTable(HSSFCellStyle shstyle, HSSFFont titlefont, String string, int i, Boolean is_bold, Boolean is_border) {
titlefont.setFontHeightInPoints((short) i);
titlefont.setFontName(string);
shstyle.setWrapText(true);//自动换行
shstyle.setAlignment(HSSFCellStyle.VERTICAL_CENTER);
if(i != 11 && is_bold){
titlefont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
}
if(is_border){
shstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
shstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左
shstyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右
shstyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上
}
shstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中
shstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//定义字体样式左右居中
shstyle.setFont(titlefont);
}
8、样式也调了,是不是调一调打印,也就是
//添加打印样式
addPrintClassData(sheet, false);
//打印的纸张样式
public static void addPrintClassData(HSSFSheet sheet, Boolean is_landscape) {
sheet.setMargin(HSSFSheet.TopMargin, 0.4);//上≈2
sheet.setMargin(HSSFSheet.BottomMargin, 0.4);//下≈2
sheet.setMargin(HSSFSheet.LeftMargin, 0.2);//左≈0.5
sheet.setMargin(HSSFSheet.RightMargin, 0.2);//右≈0.5
sheet.setHorizontallyCenter(true);
sheet.setDefaultRowHeight((short) 400);//设置默认行高
HSSFPrintSetup ps = sheet.getPrintSetup();
ps.setLandscape(is_landscape);//true横向,false纵向
ps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//设置纸张A4
}
9、Excel创建完了,你怎么给我呢?那得看你要什么了,也就是
ByteArrayOutputStream bos = null;
try{
/*1转为输入流*/
bos = new ByteArrayOutputStream();
wb.write(bos);
byte[] bytes = bos.toByteArray();
InputStream in = new ByteArrayInputStream(bytes);
/*2直接写入Excel文档*/
/*String fileName = new Date().getTime()+"frozen_excel.xls";
FileOutputStream output = new FileOutputStream("/temp/"+fileName);
wb.write(output);
output.close();*/
bos.close();
}catch (Exception e){
e.printStackTrace();
}
【总结】
看看上面9步需要哪些参数,将参数封装做一个统一的公共方法,也就是
/**
* 导出Excel
* @param title Excel标题
* @param liekuanLst 设置的每个列宽
* @param biaotouLst 表头内容
* @param contentLst 单元格内容
* @return 待定
*/
public String export_Excel(String title, List<Integer> liekuanLst, List<String> biaotouLst, List<Object[]> contentLst){
//声明工作薄
HSSFWorkbook wb = new HSSFWorkbook();
//sheet页签部分
HSSFSheet sheet = wb.createSheet(title);
//自定义列宽部分
if(liekuanLst != null && liekuanLst.size() > 0){
for (int i = 0; i < liekuanLst.size(); i++) {
sheet.setColumnWidth((short)i, liekuanLst.get(i));
}
}
//居中字体等样式区域
sheet.setHorizontallyCenter(true);
//主题
HSSFCellStyle titlefontshstyle = wb.createCellStyle();
HSSFFont titlefont = wb.createFont();
setcontentStyleTable(titlefontshstyle, titlefont, "黑体", 20, true, false);
//表头样式
HSSFCellStyle btfontshstyle = wb.createCellStyle();
HSSFFont btfont = wb.createFont();
setcontentStyleTable(btfontshstyle, btfont, "宋体", 10, true, true);
//内容样式
HSSFCellStyle shstyle = wb.createCellStyle();
HSSFFont contentfont = wb.createFont();
setcontentStyle(shstyle, contentfont, "宋体", 11);
//创建标题
HSSFRow row = sheet.createRow(0);
//设置标题行高
row.setHeight((short) 920);
HSSFCell cell = row.createCell(0);
cell.setCellValue(title);
cell.setCellStyle(titlefontshstyle);
for (int i = 1; i < liekuanLst.size(); i++) {
cell = row.createCell(i);
cell.setCellStyle(titlefontshstyle);
}
//合并标题
sheet.addMergedRegion(new Region(0, (short)0, (short)0,(short)(liekuanLst.size()-1)));
//创建表头
row = sheet.createRow(1);
//行高
row.setHeight((short) 550);
if(biaotouLst != null && biaotouLst.size() > 0){
for (int i = 0; i < biaotouLst.size(); i++) {
cell = row.createCell(i);
cell.setCellValue(biaotouLst.get(i));
cell.setCellStyle(btfontshstyle);
}
}
if(contentLst != null && contentLst.size() > 0){
//循环插入表格内容
for (int i = 0; i < contentLst.size(); i++) {
//当前行
row = sheet.createRow(i+2);
row.setHeight((short) 550);
//每个单元格
for (int j = 0; j < contentLst.get(i).length; j++) {
cell = row.createCell(j);
cell.setCellValue(String.valueOf(contentLst.get(i)[j]));
cell.setCellStyle(shstyle);
}
}
}
//添加打印样式
addPrintClassData(sheet, false);
/**
* 写入数据
*/
ByteArrayOutputStream bos = null;
try{
/*1转为输入流*/
bos = new ByteArrayOutputStream();
wb.write(bos);
byte[] bytes = bos.toByteArray();
InputStream in = new ByteArrayInputStream(bytes);
/*2直接写入Excel文档*/
/*String fileName = new Date().getTime()+"frozen_excel.xls";
FileOutputStream output = new FileOutputStream("/temp/"+fileName);
wb.write(output);
output.close();*/
bos.close();
}catch (Exception e){
e.printStackTrace();
}
return "";
}
//单元格样式
public static void setcontentStyle(HSSFCellStyle shstyle, HSSFFont titlefont, String string, int i) {
titlefont.setFontHeightInPoints((short) i);
titlefont.setFontName(string);
shstyle.setWrapText(true);//自动换行
if(i != 11){
titlefont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
}
shstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//定义字体样式左右居中
shstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中
shstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
shstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左
shstyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右
shstyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上
shstyle.setFont(titlefont);
}
public static void setcontentStyleTable(HSSFCellStyle shstyle, HSSFFont titlefont, String string, int i, Boolean is_bold, Boolean is_border) {
titlefont.setFontHeightInPoints((short) i);
titlefont.setFontName(string);
shstyle.setWrapText(true);//自动换行
shstyle.setAlignment(HSSFCellStyle.VERTICAL_CENTER);
if(i != 11 && is_bold){
titlefont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
}
if(is_border){
shstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
shstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左
shstyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右
shstyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上
}
shstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中
shstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//定义字体样式左右居中
shstyle.setFont(titlefont);
}
//打印的纸张样式
public static void addPrintClassData(HSSFSheet sheet, Boolean is_landscape) {
sheet.setMargin(HSSFSheet.TopMargin, 0.4);//上≈2
sheet.setMargin(HSSFSheet.BottomMargin, 0.4);//下≈2
sheet.setMargin(HSSFSheet.LeftMargin, 0.2);//左≈0.5
sheet.setMargin(HSSFSheet.RightMargin, 0.2);//右≈0.5
sheet.setHorizontallyCenter(true);
sheet.setDefaultRowHeight((short) 400);//设置默认行高
HSSFPrintSetup ps = sheet.getPrintSetup();
ps.setLandscape(is_landscape);//true横向,false纵向
ps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//设置纸张A4
}
【结束语】
还可以继续优化!
以上是关于像在桌面手动创建表格一样,做一个共用のExcel导出的主要内容,如果未能解决你的问题,请参考以下文章