使用POI操作Excel:Sheet拷貝
專案中很多模組需要將資料匯出到Excel中,簡單的如匯出所有的使用者資訊到Excel,對於匯出這種資料,可以通過POI/JXL直接生成Excel即可;當面臨複雜格式的報表怎麼辦呢?下面這張圖是專案中某張需要匯出的Excel模版中部分截圖,需求是根據查詢條件生成N張同類型的這種單子到Excel中的不同Sheet中,後期要列印成紙質單據!需要明確有幾個重點是:需要在A4紙中列印,所有打印出來的格式必須一樣,可能後期這張表還會進行調整,必須滿足其高擴充套件和變化性;
事實上我們依然可以通過程式將Excel寫出來,事實上開始我確實也是這麼做了,但是在做的過程中發現,要手寫程式碼生成這種幾十行的Excel實在是一個很大的工作量,尤其是對樣式的控制更是繁瑣;而且用程式生拼單元格生成Sheet
好吧,說了這麼多總算進入正題,最後我選擇了通過程式Copy整個Sheet的方式,採用通過這種實現方式,我只需要相關人員給我提供設定好模版,在批量生成的時候先通過Copy的方式生成新的Sheet,然後在向指定的Sheet中填寫相關資料即可,而且當模版發生變化時只需調整Sheet中寫值的程式碼即可!
重點是兩個方法:copySheet和copyRow,主要程式碼如下:
package org.pihai.utils.excel.poi;
import java.io.File;
import java.io.FileInputStream;
import java .io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFPrintSetup;
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.Region;
/**
* POI操作Excel
* @since: 1.0
* @version:1.0
* @createTime:2011年07月21日 10:47:20
* @updateTime:2011年07月21日 10:47:20
* @author niejy [email protected]
*
*/
public class PoiExcelSheetCopy {
/**
* 根據源Sheet樣式copy新Sheet
* @param fromsheetname
* @param newsheetname
* @param targetFile
*/
public void copySheet(String fromsheetname, String newsheetname,String targetFile) {
HSSFWorkbook wb = null;
try {
FileInputStream fis = new FileInputStream(targetFile);
wb = new HSSFWorkbook(fis);
HSSFSheet fromsheet = wb.getSheet(fromsheetname);
if (fromsheet != null && wb.getSheet(newsheetname) == null) {
HSSFSheet newsheet = wb.createSheet(newsheetname);
//設定列印引數
newsheet.setMargin(HSSFSheet.TopMargin,fromsheet.getMargin(HSSFSheet.TopMargin));// 頁邊距(上)
newsheet.setMargin(HSSFSheet.BottomMargin,fromsheet.getMargin(HSSFSheet.BottomMargin));// 頁邊距(下)
newsheet.setMargin(HSSFSheet.LeftMargin,fromsheet.getMargin(HSSFSheet.LeftMargin) );// 頁邊距(左)
newsheet.setMargin(HSSFSheet.RightMargin,fromsheet.getMargin(HSSFSheet.RightMargin));// 頁邊距(右
HSSFPrintSetup ps = newsheet.getPrintSetup();
ps.setLandscape(false); // 列印方向,true:橫向,false:縱向(預設)
ps.setVResolution((short)600);
ps.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE); //紙張型別
File file = new File(targetFile);
if (file.exists() && (file.renameTo(file))) {
copyRows(wb, fromsheet, newsheet, fromsheet.getFirstRowNum(), fromsheet.getLastRowNum());
FileOutputStream fileOut = new FileOutputStream(targetFile);
wb.write(fileOut);
fileOut.flush();
fileOut.close();
} else {
System.out.println("檔案不存在或者正在使用,請確認...");
}
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 拷貝Excel行
* @param wb
* @param fromsheet
* @param newsheet
* @param firstrow
* @param lastrow
*/
public void copyRows(HSSFWorkbook wb, HSSFSheet fromsheet,HSSFSheet newsheet, int firstrow, int lastrow) {
if ((firstrow == -1) || (lastrow == -1) || lastrow < firstrow) {
return;
}
// 拷貝合併的單元格
Region region = null;
for (int i = 0; i < fromsheet.getNumMergedRegions(); i++) {
region = fromsheet.getMergedRegionAt(i);
if ((region.getRowFrom() >= firstrow)&& (region.getRowTo() <= lastrow)) {
newsheet.addMergedRegion(region);
}
}
HSSFRow fromRow = null;
HSSFRow newRow = null;
HSSFCell newCell = null;
HSSFCell fromCell = null;
// 設定列寬
for (int i = firstrow; i <= lastrow; i++) {
fromRow = fromsheet.getRow(i);
if (fromRow != null) {
for (int j = fromRow.getLastCellNum(); j >= fromRow.getFirstCellNum(); j--) {
int colnum = fromsheet.getColumnWidth((short) j);
if (colnum > 100) {
newsheet.setColumnWidth((short) j, (short) colnum);
}
if (colnum == 0) {
newsheet.setColumnHidden((short) j, true);
} else {
newsheet.setColumnHidden((short) j, false);
}
}
break;
}
}
// 拷貝行並填充資料
for (int i = 0; i <= lastrow; i++) {
fromRow = fromsheet.getRow(i);
if (fromRow == null) {
continue;
}
newRow = newsheet.createRow(i - firstrow);
newRow.setHeight(fromRow.getHeight());
for (int j = fromRow.getFirstCellNum(); j < fromRow.getPhysicalNumberOfCells(); j++) {
fromCell = fromRow.getCell((short) j);
if (fromCell == null) {
continue;
}
newCell = newRow.createCell((short) j);
newCell.setCellStyle(fromCell.getCellStyle());
int cType = fromCell.getCellType();
newCell.setCellType(cType);
switch (cType) {
case HSSFCell.CELL_TYPE_STRING:
newCell.setCellValue(fromCell.getRichStringCellValue());
break;
case HSSFCell.CELL_TYPE_NUMERIC:
newCell.setCellValue(fromCell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_FORMULA:
newCell.setCellFormula(fromCell.getCellFormula());
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
newCell.setCellValue(fromCell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_ERROR:
newCell.setCellValue(fromCell.getErrorCellValue());
break;
default:
newCell.setCellValue(fromCell.getRichStringCellValue());
break;
}
}
}
}
public static void main(String[] args) {
PoiExcelSheetCopy ew = new PoiExcelSheetCopy();
ew.copySheet("template", "test2", "d:/template.xls");
}
}
這段程式碼依賴POI的jar包,上面的程式碼可能還是不是很簡潔,有待抽空進行優化!重點是先把這種解決方案分享給大家!
相關推薦
使用POI操作Excel:Sheet拷貝
專案中很多模組需要將資料匯出到Excel中,簡單的如匯出所有的使用者資訊到Excel,對於匯出這種資料,可以通過POI/JXL直接生成Excel即可;當面臨複雜格式的報表怎麼辦呢?下面這張圖是專案中某張需要匯出的Excel模版中部分截圖,需求是根據查詢條件生成N張同類型的這
POI操作Excel:密碼保護和公式再計算
算sheet1.setForceFormulaRecalculation(true);// 寫入excel檔案fileOut = new FileOutputStream("d:/workbook.xls");wb.write(fileOut);fileOut.close();} catch (IOExcep
Java操作Excel:POI和EasyExcel
文章與CSDN同步,歡迎訪問:https://blog.csdn.net/qq_40280582/article/details/107300081 程式碼地址:https://gitee.com/ilovemo/poi-study > 前言 我們經常需要將專案中的表格資料或者文件資料進行匯入或者匯出操作
POI操作Excel詳解,讀取xls和xlsx格式的文件
shee xss split 類型 後綴 .sh lan xls lin package org.ian.webutil; import java.io.File; import java.io.FileInputStream; import java.io.FileN
使用POI操作Excel時new XSSFWorkbook ()報錯java.lang.NoSuchMethodError解決方式
lin line java sts factor 出現 class padding test 使用最新的POI3.11時,在執行 Workbook workBook = new XSSFWorkbook ();這段代碼時出現錯誤: java.lang.NoSu
java使用POI操作excel文件,實現批量導出,和導入
tar.gz spa != nts big 應該 關於 override auth 一、POI的定義 JAVA中操作Excel的有兩種比較主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000也即以.xls為後綴的excel。而po
Java POI 操作Excel(讀取/寫入)
del sep ces 價值 name fill ber 路徑 stc pom.xml依賴: <dependency> <groupId>org.apache.poi</groupId>
POI操作Excel
遍歷 || group merge 用戶 post enc 瀏覽器信息 使用 一、POI概述 Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。 結構: HSSF
初識POI操作Excel
org poi headers ring nts tin 單元 可用 pat org.apache.poi提供開源的Excel工具包 jar包: poi.jar poi-ooxml.jar poi-ooxml-schemas.jar 簡單的操作流程: //創建excel文
POI 操作 EXCEL檔案(匯入、匯出)
1.1概述 開發中經常會設計到excel的處理,如匯出Excel,匯入Excel到資料庫中,操作Excel目前有兩個框架,一個是apache 的poi, 另一個是 Java Excel Apache POI 簡介是用Java編寫的免費開源的跨平臺的 Java API,Ap
POI操作Excel---給單元格新增超連結(HSSF & XSSF & SXSSF)
1、xls格式---(HSSF) HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("新增超連結"); HSSFRow row = sheet.createRow(
使用POI操作Excel修改模板(批量替換excel中的資料並判斷excel版本)
package com.sycamore.controller; import org.apache.poi.POIXMLDocument; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.userm
POI操作Excel常用方法總結
POI操作Excel常用方法總結 一、 POI簡介 Apache POI是Apache軟體基金會的開放原始碼函式庫,POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。 二、 HSSF概況 HSSF 是Horrible
poi操作Excel 被bug坑了getLastRowNum,getPhysicalNumberOfRows,getPh
分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
POI操作Excel的三種Workbook的發展和區別
POI的一些使用方法: 建立流程:(上級為下級的載體) 1、建立Workbook(工作薄); 2、建立Sheet(表單,可以建立多個); 3、建立Row(行); 4、建立Cell(單元格) 接下來分別說下工作簿的常用三種形式的區別,他們分別是 1.HSSFWorkbook 2.XS
自己封裝的poi操作Excel工具類
該工具類主要完成的功能是:讀取Excel、彙總Excel的功能。在讀取時,可以設定開始和結束讀取的位置、設定是否讀取多個sheet、設定讀取那個或者那些sheet等。在彙總時,如設定是否覆蓋目標檔案、設定是否比較檢查重複內容、設定檢查重複的列索引等功能。具體來演示一下吧: &nbs
poi 操作excel
1、removeRow(Row row):刪除行,但不會實現下面行上移 2、shiftRows(int startRow, int endRow, n):start行到end行移動n行,n正上移,n負下移。合併過單元格的移動會報錯 3、removeMergedRegion(int del
POI操作Excel詳解,HSSF和XSSF兩種方式
HSSF方式: package com.tools.poi.lesson1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; impor
POI操作excel修改樣式
public static void main(String[] args) throws IOException { //讀取工作簿模板 FileInputStream fileInputStream = new FileInputStream(new File("D:/workbook.
poi操作excel入門
poi是apache的一個開源框架,用來操作excel,先寫一個簡單易用的demo,後續會跟上詳細介紹 public static void main(String[] args) throws IOException { //建立檔案流 Fi