poi的匯出
最近專案中需要用到excel的匯出功能,之前也曾做過,但是沒有總結過,考慮到這個功能在web專案中的高頻使用,因此這次開發完成之後,把對excel的匯出功能進行一次總結,樣式的問題,我這次沒有考慮,主要是匯出功能的實現過程,下面就是我的程式碼:
既然是對excel的操作,那麼首先考慮的就是要把這段操作程式碼進行抽取,將其作為一個工具類進行重複呼叫,下面就是我的excel的工具類:
package com.suyin.goods.utils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 匯出Excel公共方法
* @version 1.0
*
* @author lihao
*
*/
public class ExcelUtils {
//顯示的匯出表的標題
private String title;
//匯出表的列名
private String[] rowName ;
private List<Object[]> dataList = new ArrayList<Object[]>();
private ServletOutputStream outputStream;
//構造方法,傳入要匯出的資料
public ExcelUtils(String title, String[] rowName, List<Object[]> dataList, ServletOutputStream outputStream){
this.dataList = dataList;
this.rowName = rowName;
this.title = title;
this.outputStream =outputStream;
}
/*
* 匯出資料
* */
public void export() throws Exception{
try{
HSSFWorkbook workbook = new HSSFWorkbook(); // 建立工作簿物件
HSSFSheet sheet = workbook.createSheet(title); // 建立工作表
// 產生表格標題行
HSSFRow rowm = sheet.createRow(0);
rowm.setHeight((short) (25 * 35)); //設定高度
// 定義所需列數
int columnNum = rowName.length;
HSSFRow rowRowName = sheet.createRow(0); // 在索引2的位置建立行(最頂端的行開始的第二行)
rowRowName.setHeight((short) (25 * 25)); //設定高度
// 將列頭設定到sheet的單元格中
for(int n=0;n<columnNum;n++){
HSSFCell cellRowName = rowRowName.createCell(n); //建立列頭對應個數的單元格
cellRowName.setCellType(CellType.STRING); //設定列頭單元格的資料型別
HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
cellRowName.setCellValue(text); //設定列頭單元格的值
}
//將查詢出的資料設定到sheet對應的單元格中
for(int i=0;i<dataList.size();i++){
Object[] obj = dataList.get(i);//遍歷每個物件
HSSFRow row = sheet.createRow(i+1);//建立所需的行數
row.setHeight((short) (25 * 20)); //設定高度
for(int j=0; j<obj.length; j++){
HSSFCell cell =row.createCell(j);
if(null !=obj[j] && !"".equals(obj[j])){
cell.setCellValue(obj[j].toString());
}
}
}
if(null!=workbook){
try
{
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
下面是對資料的封裝
@RequestMapping(value = "/export",method = RequestMethod.GET)
public String export(HttpServletResponse response, HttpServletRequest request,String beginTime, String endTime) {
response.setContentType("application/binary;charset=UTF-8");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Map<String, Object> paraMap = new HashMap<>();
if(StringUtils.isNotEmpty(beginTime) && StringUtils.isNotBlank(beginTime)){
paraMap.put("beginTime", beginTime);
}
if(StringUtils.isNotEmpty(beginTime) && StringUtils.isNotBlank(beginTime)){
paraMap.put("endTime", endTime);
}
try {
ServletOutputStream out = response.getOutputStream();
String title = new String((new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date())).getBytes(), "UTF-8");
response.setHeader("Content-disposition", "filename=" + title + ".xls");
String[] rowName = {"序號","使用者暱稱", "打卡內容", "打卡時間"};
List<SignVO> list = fiveMinutesServiceSign.getSignVOList(paraMap);
List<Object[]> dataList = new ArrayList<Object[]>();
Object[] objs = null;
for (int i = 0; i <list.size() ; i++) {
SignVO signVO =list.get(i);
objs =new Object[rowName.length];
objs[0] =i;
objs[1] =signVO.getNickname();
objs[2] =signVO.getComment();
objs[3] =simpleDateFormat.format(signVO.getSignTime());
dataList.add(objs);
}
ExcelUtil excelUtil = new ExcelUtil("每日五分鐘打卡",rowName,dataList,out);
excelUtil.export();
return null;
} catch (Exception e) {
e.printStackTrace();
return "匯出資訊失敗";
}
以上就是資料匯出excel的程式碼,希望能幫助到大家!後面會寫一篇關於poi的匯入,關於poi的jar包可以去我的資源地址下載: