首先需要導入包
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
然后寫方法,由于我使用的框架全部是spring
此處我只寫入實現層和控制層代碼
@Override
public InputStream loadMatComYearPlanXls(String MAT_NO_, String MAT_DESC_, Integer MAT_TYPE_, String MAT_SPEC_CAT_CODE_, String COM_CODE_, String DEPT_CODE_, Integer YEAR_, Integer MONTH_, String MAT_BUDGET_CAT_ID_, String MAT_YEAR_PLN_BATCH_ID_, Map operator) {
NPOIFSFileSystem fs = null;
Workbook workbook = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
File file = new File(this.getClass().getResource("/../../resource/matComYearPlan.xls").getFile());
FileInputStream inputStream = new FileInputStream(file);
fs = new NPOIFSFileSystem(inputStream);
workbook = (Workbook) new HSSFWorkbook(fs.getRoot(), true);
Sheet sheet = workbook.getSheetAt(0);
List> matYearPlanList = selectMatYearPlan(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_, MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BATCH_ID_, 1, -1, operator);
List> matTypedmCodeList = dmCodeService.selectDmCodeByGroupName("MAT_TYPE_", operator);
List> processStatusTypedmCodeList = dmCodeService.selectDmCodeByGroupName("PROCESS_STATUS_TYPE_", operator);
List> matBudgetCatList = matBudgetCatService.selectMatBudgetCat(1, -1, operator);
List> matSpecCatList = matSpecCatService.selectMatSpecCat(1, -1, operator);
Map matYearPlan;
String MAT_BUDGET_CAT_NAME_ = "";
String PARENT_MAT_BUDGET_CAT_ID_;
for (int i = 0; i < matYearPlanList.size(); i++) {
matYearPlan = matYearPlanList.get(i);
Row row = sheet.createRow(i + 1);
row.createCell(0).setCellValue((String) matYearPlan.get("MAT_NO_"));
row.createCell(1).setCellValue((String) matYearPlan.get("MAT_DESC_"));
row.createCell(2).setCellValue((String) matYearPlan.get("LARGE_MAT_CAT_CODE_"));
row.createCell(3).setCellValue((String) matYearPlan.get("UNIT_"));
if (matYearPlan.get("PLANNED_PRICE_") != null) {
row.createCell(4).setCellValue(((BigDecimal) matYearPlan.get("PLANNED_PRICE_")).doubleValue());
}
if (matYearPlan.get("AMOUNT_") != null) {
row.createCell(5).setCellValue(((BigDecimal) matYearPlan.get("AMOUNT_")).doubleValue());
}
if (matYearPlan.get("PLANNED_PRICE_") != null && matYearPlan.get("AMOUNT_") != null) {
row.createCell(6).setCellValue(((BigDecimal) matYearPlan.get("PLANNED_PRICE_")).doubleValue() * ((BigDecimal) matYearPlan.get("AMOUNT_")).doubleValue());
}
if (matYearPlan.get("MAT_TYPE_") != null) {
for (int j = 0; j < matTypedmCodeList.size(); j++) {
Map matTypedmCode = matTypedmCodeList.get(j);
if ((((BigDecimal) matYearPlan.get("MAT_TYPE_")).intValue()) == (((BigDecimal) matTypedmCode.get("CODE_"))).intValue()) {
row.createCell(7).setCellValue((String) matTypedmCode.get("VALUE_"));
break;
}
}
}
row.createCell(8).setCellValue((String) matYearPlan.get("DEPT_NAME_"));
for (int j = 0; j < matBudgetCatList.size(); j++) {
Map matBudgetCat = matBudgetCatList.get(j);
if (((String) matYearPlan.get("MAT_BUDGET_CAT_ID_")).equals((String) matBudgetCat.get("MAT_BUDGET_CAT_ID_"))) {
MAT_BUDGET_CAT_NAME_ = (String) matBudgetCat.get("MAT_BUDGET_CAT_NAME_");
PARENT_MAT_BUDGET_CAT_ID_ = (String) matBudgetCat.get("PARENT_MAT_BUDGET_CAT_ID_");
while (PARENT_MAT_BUDGET_CAT_ID_ != null) {
for (int k = 0; k < matBudgetCatList.size(); k++) {
matBudgetCat = matBudgetCatList.get(k);
if (PARENT_MAT_BUDGET_CAT_ID_.equals((String) matBudgetCat.get("MAT_BUDGET_CAT_ID_"))) {
MAT_BUDGET_CAT_NAME_ = (String) matBudgetCat.get("MAT_BUDGET_CAT_NAME_") + "/" + MAT_BUDGET_CAT_NAME_;
PARENT_MAT_BUDGET_CAT_ID_ = (String) matBudgetCat.get("PARENT_MAT_BUDGET_CAT_ID_");
break;
}
}
}
row.createCell(9).setCellValue("/" + MAT_BUDGET_CAT_NAME_ + "/");
break;
}
}
if (matYearPlan.get("MAT_SPEC_CAT_CODE_") != null) {
for (int j = 0; j < matSpecCatList.size(); j++) {
Map matSpecCat = matSpecCatList.get(j);
if (((String) matYearPlan.get("MAT_SPEC_CAT_CODE_")).equals((String) matSpecCat.get("CODE_"))) {
row.createCell(10).setCellValue((String) matSpecCat.get("VALUE_"));
break;
}
}
}
if (matYearPlan.get("PROCESS_STATUS_") != null) {
for (int j = 0; j < processStatusTypedmCodeList.size(); j++) {
Map processStatusTypedmCode = processStatusTypedmCodeList.get(j);
if ((((BigDecimal) matYearPlan.get("PROCESS_STATUS_")).intValue()) == (((BigDecimal) processStatusTypedmCode.get("CODE_")).intValue())) {
row.createCell(11).setCellValue((String) processStatusTypedmCode.get("VALUE_"));
break;
}
}
}
}
workbook.write(baos);
baos.flush();
byte[] bytes = baos.toByteArray();
return new ByteArrayInputStream(bytes, 0, bytes.length);
}
catch (Exception e) {
e.printStackTrace();
return null;
}
finally {
try {
fs.close();
workbook.close();
baos.close();
}
catch (IOException e) {
}
}
}
其中有個selectMatYearPlan(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_, MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BATCH_ID_, 1, -1, operator);方法是我的業務方法,可根據需要改變自己實際的參數,對自己的代碼進行修改
Row row = sheet.createRow(i + 1);
row.createCell(0).setCellValue((String) matYearPlan.get("MAT_NO_"));
這兩句代碼是與其他人不同的地方,有些人的代碼是getRow(),getCell()。那樣很可能會報空指針異常,如果以前有數據只是對其覆蓋可以使用,如果以前沒有數據,是動態生成的最后使用create方法
另外我在代碼中大量使用了String造型,而不是toString()方法,因為String相對于tostring()方法更安全,而其不會報空指針異常。而toString()方法有時會需要重寫,不是那么安全。
=null.toString()會有空指針異常,而 =(String)null則不會。
//控制層代碼
@RequestMapping(value = "loadMatComYearPlanXls")
public void loadMatComYearPlanXls(String MAT_NO_, String MAT_DESC_, Integer MAT_TYPE_, String MAT_SPEC_CAT_CODE_, String COM_CODE_, String DEPT_CODE_, Integer YEAR_, Integer MONTH_, String MAT_BUDGET_CAT_ID_, String MAT_YEAR_PLN_BATCH_ID_, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
try {
Map operator = getOperator(session);
InputStream inputStream = matYearPlanService.loadMatComYearPlanXls(MAT_NO_, MAT_DESC_, MAT_TYPE_, MAT_SPEC_CAT_CODE_, COM_CODE_, DEPT_CODE_, YEAR_, MONTH_, MAT_BUDGET_CAT_ID_, MAT_YEAR_PLN_BATCH_ID_, operator);
response.reset();
String fileName = URLEncoder.encode("廠礦年計劃表.xls", "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
ServletOutputStream out = response.getOutputStream();
byte[] content = new byte[65535];
int length = 0;
if (inputStream != null) {
while ((length = inputStream.read(content)) != -1) {
out.write(content, 0, length);
}
}
out.flush();
out.close();
}
catch (Exception e) {
insertBizLog("業務", "MatYearPlanController.loadMatComYearPlanXls", null, null, null, null, null, 1, e.getMessage(), request, session);
logger.error(e.getMessage(), e);
}
insertBizLog("業務", "MatYearPlanController.loadMatComYearPlanXls", null, null, null, null, null, 0, null, request, session);
}
控制層主要是調用實現層代碼。主要的POI代碼在實現層,網上有很多這類代碼,只是我自己對空指針的處理做了自己的改變,網絡上說的很多方法不全。
另外這這次的業務實現里,有個BigDecimal類型,http://baike.baidu.com/link?url=abJmNaoqJGE0RbYpjmOCB4otjPPqhpwYPSlMkVwPV6c_0V8I42VljBvaDtCI6h-xNIn5N5CFjrWPvvz4A132lK
由于將值放進map時都是Object類型,但在取出時,它的類型并沒有丟失,所以在.intValue(),和.doubleValue()取值時,與String不同,同時需要做空值處理
如果不想使用造型可以使用parse解析。
中間有段代碼是做的樹形的循環遞歸遍歷。
//在jsp頁面的調用
function _loadMatComYearPlanXls() {
var MAT_BUDGET_CAT_ID_ = '';
var records = Ext.getCmp('matBudgetCatPanel').getSelectionModel().getSelection();
if (records.length != 0) {
MAT_BUDGET_CAT_ID_ = records[0].get('MAT_BUDGET_CAT_ID_');
}
window.open('loadMatComYearPlanXls.do?YEAR_=' + Ext.getCmp('YEAR_').getSubmitValue() + '&MONTH_=' + Ext.getCmp('MONTH_').getSubmitValue() + '&MAT_TYPE_=' + Ext.getCmp('MAT_TYPE_').getSubmitValue() + '&MAT_YEAR_PLN_BATCH_ID_=' + Ext.getCmp('MAT_YEAR_PLN_BATCH_ID_').getSubmitValue() + '&DEPT_CODE_=' + Ext.getCmp('DEPT_CODE_').getSubmitValue() + '&MAT_NO_=' + Ext.getCmp('MAT_NO_').getSubmitValue() + '&MAT_DESC_=' + Ext.getCmp('MAT_DESC_').getSubmitValue() + '&MAT_SPEC_CAT_CODE_=' + Ext.getCmp('MAT_SPEC_CAT_CODE_').getSubmitValue() + '&COM_CODE_=' + COM_CODE_ + '&MAT_BUDGET_CAT_ID_=' + MAT_BUDGET_CAT_ID_, '_blank', 'width=40,height=30,resizable=yes,scrollbars=yes');
}
JSP頁面只是調用控制層代碼,如果自己有需要,可以按自己的方法傳參調用。
poi的API文檔:http://poi.apache.org/apidocs/org/apache/poi/xssf/streaming/SXSSFWorkbook.html#SXSSFWorkbook(org.apache.poi.xssf.usermodel.XSSFWorkbook)
對最后一行需要數值總計的處理:
if (i == matContractStockIoList.size() - 1) {
row = sheet.createRow(i + 2);
row.createCell(0).setCellValue("合計 :");
row.createCell(5).setCellFormula("SUM(F2:F" + (i + 2) + ")");
row.createCell(6).setCellFormula("SUM(G2:G" + (i + 2) + ")");
}
歡迎大家閱覽,多多評論其中的不足!!
為工程師之路添磚加瓦!!
Java poi讀取,寫入Excel2003
Java poi讀取,寫入Excel2003 相關閱讀:poi讀寫Excel2007:http://www.cnblogs.com/gavinYang/p/3576741.htmljxl讀寫excel ...
Java poi讀取,寫入Excel2007
Java poi讀取,寫入Excel2007 相關閱讀:poi讀寫Excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmljxl讀寫excel ...
POI讀取/寫入Excel文件
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...
poi讀取寫入word【未完,待續】
, [項目實戰]Java POI之Word導出經典案例一 Java POI 讀取word文件 POI-對于WORD的操作(一)
Java——poi讀取Excel文件
1.創建文件流,打開EXCEL文件 FileInputStream excelFile = new FileInputStream(excelPath); XSSFWorkbook workbook ...
Java入門開發POI讀取導入Excel文件
Apache POI是Apache開發的開源的跨平臺的?Java API,提供API給Java程序對Microsoft Office格式檔案進行各種操作. POI中Excel操作很簡單,主要類有 HS ...
Java POI 讀取Excel數據轉換為XML格式
1.首先要下載poi相關的包:http://poi.apache.org/? ,以下是所需的jar包 2.貼上詳細的代碼 public class ExcelToXml { /** * 將excel的 ...
JXL讀取,寫入Excel
JXL讀取,寫入Excel2003 相關閱讀:poi 讀寫excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmlpoi 讀寫excel200 ...
java POI實現向Excel中插入圖片
做Web開發免不了要與Excel打交道.今天老大給我一個任務-導出Excel.開始想的還是蠻簡單的,無非就是查找,構建Excel,response下載即可.但是有一點不同,就是要加入圖片, ...
隨機推薦
1130mysql explain中的type列含義和extra列的含義
很多朋友在用mysql進行調優的時候都肯定會用到explain來看select語句的執行情況,這里簡單介紹結果中兩個列的含義. 1 type列 官方的說法,說這列表示的是"訪問類型" ...
Java throws子句是怎么寫的呢?
如果一個方法可以導致一個異常但不處理它,它必須指定這種行為以使方法的調用者可以保護它們自己而不發生異常.做到這點你可以在方法聲明中包含一個throws子句.一個 throws 子句列舉了一個方法可能拋 ...
MyBatis增刪改查
MyBatis的簡介: MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名 ...
更新Code First生成的數據庫
1,首次訪問時會自動生成數據庫 2,某個Model增加一個字段后,再次訪問會報,數據庫不是最新 操作 1,Enable-Migrations 注意選擇Default project為Star.Core ...
【原創】Github團隊協作之Pull請求
首先聲明:Github上關于代碼團隊協作方式有很多種,這里只講述Github上其中的一種代碼團隊協作方式. ? Pull請求(Pull request) 1 綜述 ?? ?協作者通過fork一個新的代 ...
Serv-u 備份處理
需求分析 從刪庫到跑路,大家聽過很多,但如果沒刪備份的話,那只能說玩的不夠徹底,不專業.系統管理員一個非常重要的職責就是定期備份,以便在系統出現故障的時候能夠及時恢復.我們來看下如何備份Serv-u系 ...
JS用斜率判斷鼠標進入DIV四個方向的方法 判斷鼠標移入方向
本文要介紹的是一種鼠標從一個元素移入移出時,獲取鼠標移動方向的思路.這個方法可以幫助你判斷鼠標在移入移出時,是從上下左右的哪個方向發生的.這個思路,是我自己琢磨出來,利用了一點曾經高中學過的數學知識, ...
第三百三十九節,Python分布式爬蟲打造搜索引擎Scrapy精講—Scrapy啟動文件的配置—xpath表達式
第三百三十九節,Python分布式爬蟲打造搜索引擎Scrapy精講—Scrapy啟動文件的配置—xpath表達式 我們自定義一個main.py來作為啟動文件 main.py #!/usr/bin/en ...
Mac 命令行美化
在 mac 中使用原生的命令行工具,竟然沒有 git 命令的自動補全,在 git 倉庫下也看不到當前的分支名,不能忍.于是,開始一波改造. 目標:命名 Tab 自動補全:可以顯示分支名: 一番 Goo ...