java利用poi生成excel文件后下載本地


1、該功能需要poi的jar包,鏈接: http://pan.baidu.com/s/1migAtNq 密碼: 38fx。

2、首先新建一個實體類,用以存放單個數據

public class Test {
    private String x;
    private String y;
    private String value;
    
    public void setX(String x) {
        this.x = x;
    }
    public void setY(String y) {
        this.y = y;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public String getX() {
        return x;
    }
    public String getY() {
        return y;
    }
    public String getValue() {
        return value;
    }
}

3、將數據合並成一個集合,例如list<Test> list;

4、開始生成excel

//1、創建workbook,對應一個excel
HSSFWorkbook wb = new HSSFWorkbook();

//1.5、生成excel中可能用到的單元格樣式
//首先創建字體樣式
HSSFFont font = wb.createFont();//創建字體樣式
font.setFontName("宋體");//使用宋體
font.setFontHeightInPoints((short) 10);//字體大小
font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
//然后創建單元格樣式style
HSSFCellStyle style1 = wb.createCellStyle();
style1.setFont(font);//將字體注入
style1.setWrapText(true);// 自動換行
style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中    
style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
style1.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex());// 設置單元格的背景顏色
style1.setFillPattern(CellStyle.SOLID_FOREGROUND);
style1.setBorderTop((short) 1);// 邊框的大小
style1.setBorderBottom((short) 1);
style1.setBorderLeft((short) 1);
style1.setBorderRight((short) 1);

//2、生成一個sheet,對應excel的sheet,參數為excel中sheet顯示的名字
HSSFSheet sheet = wb.createSheet("采集對象一致率");//3、設置sheet中每列的寬度,第一個參數為第幾列,0為第一列;第二個參數為列的寬度,可以設置為0。//Test中有三個屬性,因此這里設置三列,第0列設置寬度為0,第1~3列用以存放數據
sheet.setColumnWidth(0, 0);
sheet.setColumnWidth(1, 20*256);
sheet.setColumnWidth(2, 20*256);
sheet.setColumnWidth(3, 20*256);//4、生成sheet中一行,從0開始
HSSFRow row = sheet.createRow(0);
row.setHeight((short) 800);// 設定行的高度//5、創建row中的單元格,從0開始
HSSFCell cell = row.createCell(0);//我們第一列設置寬度為0,不會顯示,因此第0個單元格不需要設置樣式
cell = row.createCell(1);//從第1個單元格開始,設置每個單元格樣式
cell.setCellValue("x");//設置單元格中內容
cell.setCellStyle(style1);//設置單元格樣式
cell = row.createCell(2);//第二個單元格
cell.setCellValue("y");
cell.setCellStyle(style1);
cell = row.createCell(3);//第三個單元格
cell.setCellValue("value");
cell.setCellStyle(style1);
//6、輸入數據
for(int i = 1; i <= list.size(); i++){
cell = row.createCell(i);
    ……//操作同第5步,通過setCellValue(list.get(i-1).getX())注入數據
    ……
}
//7、如果需要單元格合並,有兩種方式
1、sheet.addMergedRegion(new Region(1,(short)1,1,(short)11));//參數為(第一行,最后一行,第一列,最后一列)
        
2、sheet.addMergedRegion(new CellRangeAddress(2, 3, 1, 1));//參數為(第一行,最后一行,第一列,最后一列)
//8、輸入excel
FileOutputStream os = new FileOutputStream(path+"test.xls");
wb.write(os);
os.close();
5、執行完上述操作,excel已經生成在服務器的path目錄下了,文件名為test。
6、將文件發送至客戶端。
注意:在ie瀏覽器下,如果采用location.href='/ServletDownload.do';方式下載,不能在servlet中使用response.getWriter();輸出,而應該用response.getOutputStream();
否則存在下載后的excel直接在瀏覽器上打開,而不是指定文件路徑后下載。其他瀏覽器未測試過。
服務端代碼
1)、設置響應的頭文件,會自動識別文件內容
response.setContentType("multipart/form-data");
2)、設置Content-Disposition
response.setHeader("Content-Disposition", "attachment;filename=test.xls");
3)、輸出流
OutputStream out = response.getOutputStream();
4)、獲取服務端生成的excel文件,這里的path等於4.8中的path
InputStream in = new FileInputStream(new File(path));
5)、輸出文件
int b;
while((b=in.read())!=-1){
    out.write(b);
}
in.close();
out.close();
客戶端代碼
location.href='/ServletDownload';

以下記錄一些poi常用功能(歡迎大家評論補充):

合並行列:

 

sheet1.addMergedRegion(new Region(sheet1CurrRow,(short)0,sheet1CurrRow,(short)4));//合並(起始行,起始列,結束行,結束列)

sheet為HSSFSheet對象。里面四個參數依次對應合並的:起始行、起始列、結束行、結束列。

例子:如下圖中,數據4占據三列。調用上面方法,參數分別為1,0,1,2。

凍結行列:

sheet1.createFreezePane(0, 4, 0, 4);

sheet1為HSSFSheet對象。里面的四個參數依次對應合並的:要凍結的列數、要凍結的行數、右邊區域可見的左邊列數,下面區域可見的首行。

常用於對表格表頭凍結,下列數據滾動表頭仍保持在上方。

設置編碼格式:

cell.setEncoding(HSSFCell.ENCODING_UTF_16);

設置cell中格式為utf-16.用以應付可能存在的中文亂碼問題。

cell樣式:

HSSFCellStyle style = workbook.createCellStyle();//首先創建一個style

style.setAlignment(align);//水平居左、居右、居中。使用HSSFCellStyle自帶的參數:HSSFCellStyle.ALIGN_CENTER or ALIGN_LEFT or ALIGN_RIGHT

style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居左、居右、居中。使用HSSFCellStyle自帶的參數:HSSFCellStyle.VERTICAL_CENTER or VERTICAL_LEFT or VERTICAL_RIGHT

style.setWrapText(true);//自動換行

HSSFFont hssfFont = workbook.createFont();//創建字體
hssfFont.setFontName(font);//字體樣式:黑體、宋體等
hssfFont.setFontHeightInPoints((short)size);//字體大小,short格式
hssfFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//設置粗體,不需要可不設

style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//設置左邊框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);//設置下邊框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);//設置右邊框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);//設置上邊框
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));//設置數據格式:文本、貨幣、日期,百分比等
HSSFDataFormat.getBuiltinFormat("(#,##0.00_);[Red](#,##0.00)")//創建數字格式,負數則為紅色顯示。傳入的值必須為double等數字類型
HSSFDataFormat.getBuiltinFormat("text")//創建文本格式
HSSFDataFormat.getBuiltinFormat("yyyy-m-d")//創建日期格式,該方式展示的數據必須轉為String類型,同時制作出來的excel表仍展示為文本類型,需要雙擊數據格才轉為日期格式。建議采用下一種方法。
HSSFDataFormat.getBuiltinFormat("0.00%")//創建百分比格式
//創建日期格式數據,該方法傳入的參數為Date類型,制作excel展示出去即為日期格式。
HSSFDataFormat format= wb.createDataFormat();
style.setDataFormat(format.getFormat("yyyy/m/d"));//括號中參數為指定的日期類型的格式。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM