1. 程式人生 > >如何通過Java實現生成excel並通過流的方式返回,提供下載!!

如何通過Java實現生成excel並通過流的方式返回,提供下載!!

jxl.jar是通過java操作excel表格的工具類庫,還有一種是poi.這裡介紹jxl類來操作.

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import net.sf.json.JSONObject;


private void createDeviceOrderListExcel(Result<InventoryDeviceVO> result, WritableWorkbook workbook) throws Exception {
		try{
			WritableSheet wsheet = workbook.createSheet("盤點列表", 0);
			wsheet.getSettings().setVerticalFreeze(1);
			wsheet.getSettings().setVerticalFreeze(2);
			wsheet.getSettings().setVerticalFreeze(3);
			
			// 定義title單元格樣式:字型 下劃線 斜體 粗體 顏色
			WritableFont wf_title = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
			// 單元格定義
			WritableCellFormat wcf_title = new WritableCellFormat(wf_title);
			// 設定單元格的背景顏色
			wcf_title.setBackground(Colour.GRAY_25);
			// 設定對齊方式
			wcf_title.setAlignment(Alignment.CENTRE);
			wcf_title.setVerticalAlignment(VerticalAlignment.CENTRE);
			//設定邊框
			wcf_title.setBorder(Border.ALL, BorderLineStyle.THIN,Colour.BLACK);
			
			// 定義body單元格樣式:定義格式 字型 下劃線 斜體 粗體 顏色 
			WritableFont wf_table = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
			WritableCellFormat wcf_table = new WritableCellFormat(wf_table);
			wcf_table.setBackground(Colour.WHITE);
			wcf_table.setAlignment(Alignment.CENTRE);
			wcf_table.setVerticalAlignment(VerticalAlignment.CENTRE);
			wcf_table.setBorder(Border.ALL, BorderLineStyle.THIN,Colour.BLACK);
			
			// title名稱
			String[] str = {"配置項編號","裝置名稱","規格型號","出庫日期","所在地點","資產財務編號","清查確認所在地","使用部門","使用人","管理責任人",
					"單價","盤點結果","賬實相符","在用","閒置","報廢待處理","盤虧"};
			
			// 在Label物件的構造子中指名單元格位置是第幾列第幾行
			for (int i = 0; i < 14; i++) {
				// 第一步:設定顯示列寬度
				switch (i) {
				case 0: case 2: case 8:
					wsheet.setColumnView(i, 16);
					break;
				case 1: case 3: case 6: case 12:
					wsheet.setColumnView(i, 12);
					break;
				case 4: case 5:
					wsheet.setColumnView(i, 14);
					break;
				case 7: case 9: case 10: 
					wsheet.setColumnView(i, 8);
					break;
				case 11: case 13:
					wsheet.setColumnView(i, 6);
					break;
				default:
					break;
				}
				
				// 第二步:建立新增到wsheet的cell
				Label label = null;
				if (i == 4) {
					// 所在地點
					label = new Label(i, 0, str[i], wcf_title);
					// 資產財務編號
					Label assetfinNumLab = new Label(i, 1, str[i+1], wcf_title);
					wsheet.addCell(assetfinNumLab);
				} else if (i == 5) {
					// 清楚確認所在地
					label = new Label(i, 1, str[i+1], wcf_title);
				} else if (i == 10) {
					// 盤點結果
					label = new Label(i, 0, str[i+1], wcf_title);
					// 賬實相符
					Label realLab = new Label(i, 1, str[i+2], wcf_title);
					wsheet.addCell(realLab);
					// 在用
					Label usingLab = new Label(i, 2, str[i+3], wcf_title);
					wsheet.addCell(usingLab);
				} else if (i == 11) {
					// 閒置
					label = new Label(i, 2, str[i+3], wcf_title);
				} else if (i == 12) {
					// 報廢待處理
					label = new Label(i, 2, str[i+3], wcf_title);
				} else if (i == 13) {
					// 盤虧
					label = new Label(i, 1, str[i+3], wcf_title);
				} else {
					if ( i>5 && i<10) {
						label = new Label(i, 0, str[i+1], wcf_title);
					} else {
						label = new Label(i, 0, str[i], wcf_title);
					}
				}
				wsheet.addCell(label);
				
				// 第三步:合併單元格
				if (i == 4 && i < 11) {
					// 所在地點
					wsheet.mergeCells(i, 0, i+1, 0);
					// 資產財務編號
					wsheet.mergeCells(i, 1, i, 2);
				} else if (i == 5 && i < 11) {
					// 清查確認所在地點
					wsheet.mergeCells(i, 1, i, 2);
				} else if (i == 10 && i < 11) {
					// 盤點結果
					wsheet.mergeCells(i, 0, i+3, 0);
					// 賬實相符
					wsheet.mergeCells(i, 1, i+2, 1);
				} else if (i < 11){
					wsheet.mergeCells(i, 0, i, 2);
				}
			}
			// 合併盤虧
			wsheet.mergeCells(13, 1, 13, 2);
			// 輸出值到excel
			int j = 3;
			for (InventoryDeviceVO order : result) {
				int index = 0;
				// 配置項編號
				wsheet.addCell(new Label(index++, j, order.getAssetBarcode()==null ?"":order.getAssetBarcode(), wcf_table));
				// 裝置名稱
				wsheet.addCell(new Label(index++, j, order.getDeviceName()==null ?"":order.getDeviceName(), wcf_table));
				// 規格型號
				wsheet.addCell(new Label(index++, j, order.getAssetModel()==null ?"":order.getAssetModel(), wcf_table));
				// 出庫日期
				if (!isNull(order.getCiOutStroageDate())) {
					wsheet.addCell(new Label(index++, j, dateToStr(order.getCiOutStroageDate(),"yyyy-MM-dd"), wcf_table));
				} else {
					wsheet.addCell(new Label(index++, j, "", wcf_table));
				}
				// 資產財務編號
				wsheet.addCell(new Label(index++, j, order.getCiFinanceCode()==null ?"":order.getCiFinanceCode(), wcf_table));
				// 清查確認所在地點
				wsheet.addCell(new Label(index++, j, order.getConfirmArea()==null ?"":order.getConfirmArea(), wcf_table));
				// 所屬部門
				wsheet.addCell(new Label(index++, j, order.getCiUseUserDepartment()==null ?"":order.getCiUseUserDepartment(), wcf_table));
				// 使用人
				wsheet.addCell(new Label(index++, j, order.getCiUseUser()==null ?"":order.getCiUseUser(), wcf_table));
				// 管理責任人
				wsheet.addCell(new Label(index++, j, order.getManagerRes()==null ?"":order.getManagerRes(), wcf_table));
				// 單價
				wsheet.addCell(new Label(index++, j, order.getCiPrice()==null ?"":order.getCiPrice(), wcf_table));
				// 在用(由客戶填寫,這裡設定為空)
				wsheet.addCell(new Label(index++, j, "", wcf_table));
				// 閒置(由客戶填寫,這裡設定為空)
				wsheet.addCell(new Label(index++, j, "", wcf_table));
				// 報廢待處理(由客戶填寫,這裡設定為空)
				wsheet.addCell(new Label(index++, j, "", wcf_table));
				// 盤虧(由客戶填寫,這裡設定為空)
				wsheet.addCell(new Label(index++, j, "", wcf_table));
				
				j++;
			}
		}catch(Exception e){
			e.printStackTrace();
			BeanLog.getLogger().fatal("構造book", e);
			throw e;
		}
	}

這裡面有 幾個方法講解一下

將結果以流的方式返回

outputStream = WebUtils.getOutputStream(response, fileName + ".xls", "UTF-8");
// 匯出查詢結果
WritableWorkbook workbook = Workbook.createWorkbook(outputStream);

建立一個sheet頁

WritableSheet wsheet = workbook.createSheet("盤點列表", 0);

對應的設定是

// 定義title單元格樣式:字型 下劃線 斜體 粗體 顏色
WritableFont wf_title = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.BLACK);
// 單元格定義
WritableCellFormat wcf_title = new WritableCellFormat(wf_title);
// 設定單元格的背景顏色
wcf_title.setBackground(Colour.GRAY_25);

// 設定對齊方式
wcf_title.setAlignment(Alignment.CENTRE);

wcf_title.setVerticalAlignment(VerticalAlignment.CENTRE);
 //設定邊框
 wcf_title.setBorder(Border.ALL, BorderLineStyle.THIN,Colour.BLACK);

// 在Label物件的構造子中指名單元格位置是第幾列第幾行
 Label label1 = new Label(0, 0, "匯出盤點管理", wcf_title);

合併單元格 wsheet.mergeCells(0, 0, 7, 0);

第一個引數,左邊的列數,第二個引數,左邊的行數,第三個引數,右邊的列數,第四個引數,右邊的行數

wsheet.addCell(label1);將該單元格新增到sheet頁

wsheet.setColumnView(i, 16);設定單元格的寬度;

wsheet.setRowView(arg0, arg1);設定單元格的長度

將一個list迴圈的資料,新增到sheet頁

for (InventoryDeviceTestVO order : result) {
				int index = 0;
				// 配置項編號
				wsheet.addCell(new Label(index++, j, order.getAssetBarcode()==null ?"":order.getAssetBarcode(), wcf_table));
				// 裝置名稱
				wsheet.addCell(new Label(index++, j, order.getDeviceName()==null ?"":order.getDeviceName(), wcf_table));
				// 規格型號
				wsheet.addCell(new Label(index++, j, order.getAssetModel()==null ?"":order.getAssetModel(), wcf_table));
				// 出庫日期
				if (!isNull(order.getCiOutStroageDate())) {
					wsheet.addCell(new Label(index++, j, dateToStr(order.getCiOutStroageDate(),"yyyy-MM-dd"), wcf_table));
				} else {
					wsheet.addCell(new Label(index++, j, "", wcf_table));
				}
				// 資產財務編號
				wsheet.addCell(new Label(index++, j, order.getCiFinanceCode()==null ?"":order.getCiFinanceCode(), wcf_table));
				// 所屬部門
				wsheet.addCell(new Label(index++, j, order.getCiUseUserDepartment()==null ?"":order.getCiUseUserDepartment(), wcf_table));
				// 使用人
				wsheet.addCell(new Label(index++, j, order.getCiUseUser()==null ?"":order.getCiUseUser(), wcf_table));
				// 單價
				wsheet.addCell(new Label(index++, j, order.getCiPrice()==null ?"":order.getCiPrice(), wcf_table));
				j++;
				}
			}


相關推薦

如何通過Java實現生成excel通過方式返回,提供下載!!

jxl.jar是通過java操作excel表格的工具類庫,還有一種是poi.這裡介紹jxl類來操作. import jxl.Workbook; import jxl.format.Alignment; import jxl.format.Border; import jxl

Asp.net MVC簡單實現生成Excel下載

user query 輔助類 his rpath play 是我 none mod 由於項目上的需求,需要導出指定條件的Excel文件。經過一翻折騰終於實現了。 現在把代碼貼出來分享 (直接把我們項目裏面的一部份輔助類的代碼分享一下) 我們項目使用的是Asp.Net M

java 實現生成excel表頭,A-Z;AA-ZZ;AAA-ZZZ支援無限

public String getKey(int index){ String colCode = ""; char key='A'; int loop = index / 26;

Java實現讀取Excel按條件輸出TXT

據我所知,java中能操作Excel檔案的jar包有兩個 Apache公司的一個API 微軟的java Excel包 在這裡我使用的是第二個,微軟公司的java Excel包 這個包出現了一個為題,並不能順利的輸出規定的xls 會報錯 在測試多次無

Web_telnet 通過JAVA實現網頁上面的命令列遠端工具 以及對於的理解

  前言 這幾天研究了一下如何在web頁面上通過telnet 連線一個遠端的機器,通過命令列進行控制,讓然,B/S架構的專案,如果直接通過 瀏覽器是無法和遠端機器進行通訊的,我們就得藉助後端來幫助實現這樣的一個功能需求,具體的實現邏輯是: 使用者———&mdash

通過Java實現鬥地主

inf AS 9.png import layer TE 編號 ber package 功能:洗牌,發牌,對玩家手中的牌排序,看牌 package demo06; import java.util.ArrayList; import java.util.

springmvc 使用poi解析excel通過hibernate連續插入多條數據 實際數據庫只能保存最後一條

mvc nbsp block png 技術 測試 info 保存 csdn 有一個原始數據的excel表 用poi解析之後通過hibernate插數據庫 結果 後來發現,有人說 果斷嘗試 問題解決 但是這好像並不是真正解決問題,只是解決了一個現象 因為有

通過Java實現HMAC,將字串雜湊成為全部由字母組成的密文串

以下Java程式碼可以將任何字串通過HMAC雜湊,並輸出成由大寫的A到P組成的密文字串。 public class HMAC { private final static String KEY_MAC = "HMACMD5"; /** * 全域性陣列 *

JAVA -- 生成Excel 上傳到 FTP 不生成本地檔案

直接上程式碼 POM.XML 這裡只是主要的jar <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>

Excel--通過poi普通生成excel檔案

public static void writeExcel(List<List<String>> dataList) { String finalXlsxPath = System.getProperty("user.dir") + "Bai

(二)使用apache的commons-httpclient-3.1.jar之通過Java實現發起HTTP請求【使用代理】

    本檔案介紹在需要通過代理才能訪問外網的情況下如何以純Java實現發起HTTP的請求。此部分內容與上一篇部落格內容大同小異,只有兩處稍有不同。    1.準備需要的Jar包        需要的jar包與上一篇介紹的相同,包括:commons-httpclient-3.

Java實現開啟Excel檔案,執行VBA指令碼監測檔案狀態

   /** * @author DevinLiu * 一鍵釋出報告 * 2018年9月19日下午2:44:19 */ public class GenerateReport { public String report(){

JAVA實現建立Excel匯出

1.首先下載poi-3.6-20091214.jar,下載地址如下: 或者使用Maven倉庫管理,在pom檔案新增座標             <dependency>   <groupId>org.apache.poi</group

通過Java實現Linux系統下grep指令的功能

現有如下方法可實現在Windows系統下通過Java程式碼實現與第一種使用方法相同的功能:import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOEx

通過java實現解壓zip,rar的程式碼

package com.zuidaima.main; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.i

spring自動裝配和通過java實現裝配

ati 三方庫 autowired 模式 限定 程序 str primary java實現 1.組建掃描 在類上添加註解@Component註解可以實現組建掃描 @Component public class A{ ... } 2.自動裝配 通過在屬性上或者方

通過patch實現生成使用補丁

一、原理   diff比較兩個檔案或檔案集合的差異,並記錄下來,生成一個diff檔案,這也是我們常說的patch檔案,即補丁檔案。   patch能將diff檔案運用於 原來的兩個集合之一,從而得到

Java根據模板生成excel下載

需要用到的jar包有freemarker-2.3.18.jar,freemarker-util-0.0.1-SNAPSHOT.jar,jxl-2.6.10.jar,jxl-report-1.0.jar,這些網上都有,可以去找 來吧,直接上乾貨。excel模板如圖: 很容

vue項目如何通過前端實現自動識別配置服務器環境地址

syn style default 不同的 檢查 開放 定義 獲取 api 前言: 一般來說,一個web項目的生產環境和測試環境的服務器地址一旦確定下來,很少會頻繁變動的。那麽就可以單獨寫一個腳本文件,通過當前訪問的域名來判斷當前的訪問環境,然後再通過一定的規則獲取對應的

Java動態生成SQL語句通過JDBC達成資料庫操作

在java中使用jdbc進行資料庫操作的時候 我們或許需要從多個表中進行查詢和插入操作 特別是如果多個表還有相互的依賴關係的話,插入操作就顯得非常難受 因為或許每一個動作,都需要重寫一個完全不同的sql語句 這樣的話程式碼量確實十分的大 而且程式碼會顯