目前本人主要使用两种方法1.用原生的对象进行操作不使用模板,但是在表比较复杂是会有许多麻烦;2.模板法,若想生成的表格较复杂,可以先做一个空excel表格模板将样式做好,然后用输入流将整个文件读取再封装成excel对象然后进行遍历插入数据;
方法一: 工具类(封装生成excel和相应样式的方法)
package com.adon.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
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.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;
public class BuildExcel {
/**
* 生成Excel
* @param columnNum 列数
* @param itemMarks 列头名称 对应 Map中的Key
* @param itemParaps 列头名称
* @param list 数据
* @return
*/
public static HSSFWorkbook getInputStream(int columnNum, String[] itemMarks, String[] itemParaps, List list,String title){
HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象
HSSFSheet sheet = workbook.createSheet(); // 创建工作表
sheet.setDefaultColumnWidth ((short)20); // 设置工作表列宽
sheet.setDefaultRowHeight((short)10); // 设置工作表行高
//sheet样式定义
HSSFCellStyle columnTopStyle = getColumnTopStyle(workbook); //获取列头样式对象
HSSFCellStyle style = getStyle(workbook); //单元格样式对象
//<span style="color:#FF0000;"><em><strong>下面五行代码就是设置表头的代码</strong></em></span>(原理是将第1、2行合并单元格后作为表头区域)
// 产生表格标题行
HSSFRow rowm = sheet.createRow(0);
HSSFCell cellTiltle = rowm.createCell(0);
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (itemMarks.length-1)));
cellTiltle.setCellStyle(columnTopStyle);
cellTiltle.setCellValue(title);
//设置列头
HSSFRow row1 = sheet.createRow((short)2); // 在索引0的位置创建行(最顶端的行)
HSSFCell cell1 = null; // 在索引0的位置创建单元格(左上端)
// 将列头设置到sheet的单元格中
for(int n=0;n<columnNum;n++){
cell1 = row1.createCell((short)(n)); //创建列头对应个数的单元格
cell1.setCellType(HSSFCell.CELL_TYPE_STRING); //设置列头单元格的数据类型
try {
cell1.setCellValue(new String(itemParaps[n].getBytes("utf-8"),"UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} //设置列头单元格的值
cell1.setCellStyle(columnTopStyle); //设置列头单元格样式
}
//将查询出的数据设置到sheet对应的单元格中
if(list != null){
for(int i=0;i<list.size();i++){
Map map = (Map)list.get(i); //遍历每个对象
//创建行(从下面的i+1要注意,第0行是列头,因此创建新行要从下一行开始)
HSSFRow row = sheet.createRow(i+3); //创建所需的行数
for(short j=0;j<columnNum;j++){
HSSFCell cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);//设置单元格的数据类型
if(map.get(itemMarks[j])!=null){
cell.setCellValue(map.get(itemMarks[j]).toString()); //设置单元格的值
}else{
cell.setCellValue("");
}
cell.setCellStyle(style); //设置单元格样式
}
}
}
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// ByteArrayInputStream is = null;
/* try {
workbook.write(baos);
byte[] content = baos.toByteArray();
is = new ByteArrayInputStream(content,0,content.length);
baos.flush(); // 缓冲
baos.close(); // 关闭流
} catch (IOException e) {
e.printStackTrace();
}*/
return workbook;
}
/**
* 生成双公示Excel(注意与上方法有点不同)
* @param columnNum 列数
* @param itemMarks 列头名称 对应 Map中的Key
* @param itemParaps 列头名称
* @param list 数据
* @return
*/
public static HSSFWorkbook getInputStreamSGS(int columnNum, String[] itemMarks, String[] itemParaps, List list,String title){
HSSFWorkbook workbook = new HSSFWorkbook();