javaexcel導出,java excel導出工具

本文目錄一覽:

java將數據導出excel計算其文件大小

熱門頻道

首頁

博客

研修院

VIP

APP

問答

下載

社區

推薦頻道

活動

招聘

專題

打開CSDN APP

Copyright © 1999-2020, CSDN.NET, All Rights Reserved

打開APP

大數據導出excel大小限制_java 導出Excel 大數據量,自己經驗總結! 原創

2020-12-19 01:58:16

weixin_39655377

碼齡5年

關注

分析導出實現代碼,XLSX支持:

/*** 生成XLSX,2007版本的excel,每個sheet無6.5W的行數限制,但是到了一定數量,可能內存溢出,

* 次方法適合在預計10W以下的數據導出時使用,本機測試,14W可以導出。列數量在8列左右

*

*@paramfileOut

* 輸出流

*@paramsheetMap

* 要設置的數據信息

*@throwsSQLException*/

public static voidcreateXSLXByResultSet(OutputStream fileOut, WriteXLSBean… beans)throwsSQLException {try{//重點 Workbook

Workbook wb = newXSSFWorkbook();for (int i = 0, len = beans.length; i len; i++) {

WriteXLSBean xlsBean=beans[i];

Sheet sheet=wb.createSheet(xlsBean.getSheetName());

ResultSet rs=xlsBean.getRs();

ResultSetMetaData rsmd=rs.getMetaData();

TypeHandlerRegistry tr=BeanContext.tr;

Map th =xlsBean.getTh();int index = 0;while(rs.next()) {long t1 =System.currentTimeMillis();

org.apache.poi.ss.usermodel.Row row=sheet

.createRow(index);for (int j = 0, numberOfColumns = rsmd.getColumnCount(); j numberOfColumns; j++) {

String key= rsmd.getColumnLabel(j + 1).toLowerCase();if(th.containsKey(key)) {

TypeHandler type =tr.getTypeHandler(JdbcType

.forCode(rsmd.getColumnType(j+ 1)));

Object obj=type.getResult(rs, key);

row.createCell(j).setCellValue(obj== null ? “”: obj.toString());

}

}

System.out.println(index+ ” :”

+ (System.currentTimeMillis() -t1));

index++;

}

}//重點 Workbook

wb.write(fileOut);

}catch(IOException e) {

e.printStackTrace();throw new ServiceRunTimeException(“生產xls文檔錯誤”, e);

}finally{

}

}

在上面 標註了重點的兩處,分別是:

1.構建一個Excel對象

2.將該對象寫入一個OutPutStream

而在構建過程中,沒有地方寫入OutPutSteam ,也就是說必須在內存中構建整個 Excel,才能進行寫出操作,在大數據量情況下,這樣將導致所有數據加載到內存中,而不能輸出,導致最後 內存溢出。

根據運行環境不用,可能內存溢出的 情況不同

根據情況,如果數據量達到10W以上,建議使用

1、多個Excel,每個Excel一個Sheet,因為所有Sheet都是Workbook的組成部分。如果不分多個Excel,即使分Sheet也沒用,

2、每個Excel中列數適中,比如: 5W行每個Excel檔,實現分多次導出和分頁查詢原理一樣

3、對多個Excel導出到一個臨時目錄,並通過程序壓縮,然後提供給客戶下載

2003版通過數據庫結果存到List中,然後進行生產:Table 就是List Row 是Map

/*** 生產xls,2003版本的excel,每個sheet有6.5W的行數限制

*

*@paramfileOut

* 輸出流,未關閉

*@paramsheetMap

* 要導出的數據信息*/

public static void createXSLByMap(OutputStream fileOut, MapsheetMap) {try{

HSSFWorkbook wb= newHSSFWorkbook();

Set keys =sheetMap.keySet();for (Iterator iterator =keys.iterator(); iterator

.hasNext();) {

String SheetKey=iterator.next();

Sheet sheet=wb.createSheet(SheetKey);

List sheetRows =sheetMap.get(SheetKey);for (int i = 0, len = sheetRows.size(); i len; i++) {

Map cellMap =sheetRows.get(i);

Set cellSet =cellMap.keySet();

org.apache.poi.ss.usermodel.Row row=sheet.createRow(i);int j = 0;for (Iterator iterCell =cellSet.iterator(); iterCell

.hasNext(); j++) {

String cellKey=iterCell.next();

Object obj=cellMap.get(cellKey);

row.createCell(j).setCellValue(obj== null ? “”: obj.toString());

}

}

}

wb.write(fileOut);

}catch(IOException e) {

e.printStackTrace();throw new ServiceRunTimeException(“生產xls文檔錯誤”, e);

}finally{

}

}

新版本 POI+office 2007版本excel可以導出幾十萬條而不內存溢出,詳細見:

導出大量數據到 excel 的 xlsx文件

static String src=”abcdefafslfelgtryjukjhgfdadertjDSFGHJKJGHFERTUIOabcdefafslfelgtryjukjhgfdadertjDSFGHJKdertjDSFGHJKJGHFERTUIOabcdefafslfelgtryjukjhgfdadertjDSFGHJKJGHFERTUIO”;

public static void main(String[] args) throwsThrowable {

SXSSFWorkbook wb = new SXSSFWorkbook(100); //這裡100是在內存中的數量,如果大於此數量時,會寫到硬盤,以避免在內存導致內存溢出

Sheet sh =wb.createSheet();

for (int rownum = 0; rownum 1000000; rownum++) {

Row row =sh.createRow(rownum);

for (int cellnum = 0; cellnum 10; cellnum++) {

Cell cell =row.createCell(cellnum);

String address = newCellReference(cell).formatAsString();

cell.setCellValue(address+src.substring(rownum%10*10+1, (rownum%10+1)*10));

}

}

File file = new File(“F:/aa.xlsx”);

file.createNewFile();

FileOutputStream out = newFileOutputStream(file);

wb.write(out);

out.close();

}

內存使用情況:

根據以上前輩經驗,自己在結果自身需求考慮,整合出一個工具。解決了excle表.xls格式行數65535行的限制。我實現的形式是導出一張表,裡面有多頁

(我是已65000為一頁)

這裡是用反射來使用所有傳入進行的實體的屬性的值。這裡只針對String和基本數據類型。如有自己定義的類型需要自己加上。

packagecom.tommy.fundation.util;importjava.lang.reflect.Field;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;public classRelectUtil {public static List reflectEntity(T model,Class cals) throwsNoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchFieldException{

List list = new ArrayList();

Field[] field= model.getClass().getDeclaredFields(); //獲取實體類的所有屬性,返回Field數組

for(int j=0 ; j

String nam = field[j].getName(); //獲取屬性的名字

String name =nam;

name= name.substring(0,1).toUpperCase()+name.substring(1);

String type= field[j].getGenericType().toString(); //獲取屬性的類型

if(type.equals(“class java.lang.String”)){ //如果type是類類型,則前面包含”class “,後面跟類名

Method m = model.getClass().getMethod(“get”+name);

String value= (String) m.invoke(model); //調用getter方法獲取屬性值

if(value != null){

list.add(value);

}else{

list.add(“”);

}

}if(type.equals(“class java.lang.Integer”)){

Method m= model.getClass().getMethod(“get”+name);

Integer value=(Integer) m.invoke(model);if(value != null){

list.add(value);

}else{

list.add(“”);

}

}if(type.equals(“class java.lang.Short”)){

Method m= model.getClass().getMethod(“get”+name);

Short value=(Short) m.invoke(model);if(value != null){

list.add(value);

}else{

list.add(“”);

}

}if(type.equals(“class java.lang.Double”)){

Method m= model.getClass().getMethod(“get”+name);

Double value=(Double) m.invoke(model);if(value != null){

list.add(value);

}else{

list.add(“”);

}

}if(type.equals(“class java.lang.Boolean”)){

Method m= model.getClass().getMethod(“get”+name);

Boolean value=(Boolean) m.invoke(model);if(value != null){

list.add(value);

}else{

list.add(“”);

}

}if(type.equals(“class java.util.Date”)){

Method m= model.getClass().getMethod(“get”+name);

Date value=(Date) m.invoke(model);if(value != null){

list.add(value);

}else{

list.add(“”);

}

}

}returnlist;

}

}

下面將是重點實現導出excel表

packagecom.tommy.fundation.util;importjava.io.OutputStream;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Set;importjavax.servlet.http.HttpServletResponse;importorg.apache.poi.hssf.record.formula.functions.T;importorg.apache.poi.hssf.usermodel.HSSFRow;importorg.apache.poi.hssf.usermodel.HSSFSheet;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;

@SuppressWarnings(“hiding”)public class ExportExcel{/*** 導出多張excel表,解決xls格式行數65535的限制

*@authorOnlyOne

*@paramresponse

*@paramlist 需要處理的list數據集合

*@throwsException*/@SuppressWarnings(“deprecation”)public void doExcel(HttpServletResponse response,List list,String fileName) throwsException {

OutputStream os= response.getOutputStream();//獲取輸出流

response.reset();//設置下載頭部信息。Content-disposition為屬性名。attachment表示以附件方式下載,如果要在頁面中打開,則改為inline。filename為文件名

response.setHeader(“Content-disposition”, “attachment; filename=excell.xls”);

response.setContentType(“application/msexcel”);

Map sheetMap =daData(list);

HSSFWorkbook wb= newHSSFWorkbook();

Set keys =sheetMap.keySet();for (Iterator iterator =keys.iterator(); iterator.hasNext();) {

Integer SheetKey=iterator.next();

HSSFSheet sheet= wb.createSheet((fileName+SheetKey).toString());

List sheetRows =sheetMap.get(SheetKey);for (int i = 0, len = sheetRows.size(); i len; i++) {

T en=(T) sheetRows.get(i);

List dataList = RelectUtil.reflectEntity(en, en.getClass());

HSSFRow row=sheet.createRow(i);

row.createCell(0).setCellValue(String.valueOf(i));for(int m=0; m

row.createCell(m+1).setCellValue(dataList.get(m).toString());

}

}

}

wb.write(os);

}/*** 此方法將數據集合按65000個進行分割成多個子集合

*@authorOnlyOne

*@paramlist 需要處理的list數據集合

*@return

*/

public Map daData(Listlist){int count = list.size()/65000;int yu = list.size() % 65000;

Map map = new HashMap();for (int i = 0; i = count; i++) {

List subList = new ArrayList();if (i ==count) {

subList= list.subList(i * 65000, 65000 * i +yu);

}else{

subList= list.subList(i * 65000, 65000 * (i + 1)-1);

}

map.put(i, subList);

}returnmap;

}

}

在Java中調用的方式

@RequestMapping(value = “/doExcel”, method =RequestMethod.GET)public void doExcel(HttpServletResponse response,HttpServletRequest request) throwsException {

List list =enrolltgService.findAll();new ExportExcel().doExcel(response, list, “黑白淡奶”);

}

大功搞成,以後再也不會為了數據量太大而導不出來煩惱了!!!

需要的包 poi-3.2-FINAL-20081019.jar

相關資源:poi讀取大文件Excel,使用xml格式解析,速度實測50mb文件13s,可指定…

打開CSDN,閱讀體驗更佳

POI多線程分表導出百萬級大數據量EXCEL導出_Zhuo_chao的博客-CSDN博 …

由上面可知 Excel 2003及以下是無法實現單sheet百萬級的數據。 ApachePOI 簡介 Apache POI 是用Java編寫的免費開源的跨平台的 JavaAPI,Apache POI提供API給Java程式對Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式檔案讀和寫的功…

Java 使用POI導出數據到 excel,單 sheet 和多 sheet__修鐵路的的博客…

單sheet 和多 sheet,用到的jar都是一樣的,無非就是多創建一個 sheet的問題,以下是需要用到的jar包,在對應模塊的pom.xml 中引入即可 dependency groupIdorg.apache.poi/groupId …

java導出excel超出65533行

業務背景: 列表導出,數據導出超過65533行 解決方案: 1、超出65533行,直接系統提示:本系統支持導出的最大條數為65533行 2、導出模版改為.xlsx,POI導出時用XSSFWorkbook,把所有數據都拿到內存里,可以導出超過65533行,但是上線之後,發現會內存溢出 3、導出模版改為.xlsx,POI導出時用SXSSFWorkbook,每次往內存里放一定的數據,導完之後,刷新,再次…

繼續訪問

Java的poi導出的excel不能超過256列的解決辦法

Java的poi導出的excel不能超過256列的解決辦法背景1、現在的情況2、解決辦法 背景 1、現在的情況 excel文件名以.xls結尾 這個構造函數中默認採取這個類型 this.type = ExcelType.HSSF; public ExportParams(String title, String sheetName) { this.color = HSSFColorPredefined.WHITE.getIndex(); this.headerColor = HSSFC

繼續訪問

使用ApachePOI導出excel(多個sheet頁)_我是橘子京的博客

2、設置導出excel路徑 //導出的文件路徑 String filePath=”D:\\excel.xls”; 1 2 3、創建excel文件 //創建Excel文件(Workbook) HSSFWorkbook workbook = new HSSFWorkbook(); 1 2 4、設置單元格樣式 //設置單元格樣式 HSSFCel…

POI3.8 導出大數據excel(50萬左右)_咖啡加糖_的博客_poi支持最…

import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellReference; import org.apache.poi.xssf.streaming.SXSSFWorkbook; …

最新發布 【JAVA問題解決方案】01.EasyExcel導出數據超過Excel單表上限解決方案

1.了解一下Excel單表最多存儲多少行數據(可以存儲1048576條數據,1024的平方,2的20次方)。本文是介紹EasyExcel導出數據超過Excel單表上限解決方案。2.知道最多多少行就能以這個數為條件,如果超過則進行分表。3.分表的同時需要對數據進行分割,才能不超過最大限度。實體類(非常簡單,為了導出表更快)

繼續訪問

java實現流輸出形式導出數據(使用EasyExcel)並打包為zip包

java實現流輸出形式文件下載並打包為zip包 pom.xml文件導入easyexcel dependency groupIdcom.alibaba/groupId artifactIdeasyexcel/artifactId version2.0.5/version /d…

繼續訪問

…到excel文件(xls格式),附實驗結果(單張sheet最多可有65536行) Fi…

使用POI導出MySQL數據庫數據到excel文件(xls格式) 注意事項:單張sheet最多存儲65536行!否則報錯! Caused by: java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535) !

使用Apache POI導出百萬條EXCEL數據_橙樂果果的博客

工作中,有這麼一個需求:每天凌晨00:05分定時從數據庫導出大於三個月的訂單流水信息,保存為excel文件。 Just do it. 1.引入POM依賴 !– excel — !– — …

Linux下讀寫文件操作

Linux下讀寫文件操作 #includestdio.h typedef struct Student { int no; char name[10]; int score; }Student; int main(int args,char *argv[]) { //打開文件 FILE *fp=fopen(“test.txt”,”w”); if(fp=NULL) { perror(“fopen”); …

繼續訪問

Java導出超大Excel文件,防止內存溢出

Java導出超大Excel文件,防止內存溢出1.採用Poi中的SXSSFWorkbook2.maven中引入Poi3.測試過程4.單元測試Java代碼5.結論 將業務數據導出到Excel表中,導出任務數據量較大時,導出的項目就會內存溢出,本文通過Java操作Poi的SXSSFWorkbook類進行導出,解決內存溢出問題。 1.採用Poi中的SXSSFWorkbook 在實現excel導出時,在數據量過大的情況下,總是容易發生內存溢出的情況。可以使用POI提供的 SXSSFWorkbook 類來避免內存溢

繼續訪問

Apache Poi導出Excel多Sheet頁詳解!_奧鵬馬的博客

apache poi是目前比較常用導出excel的方式。最近想要實現一個導出excel多sheet頁的功能。 網上查了一下大多都是針對某個具體對象的導出,不能實現任意對象的導出。現在將自己研究出的代碼貼出來,供大家參考。 //注意:此處實現的關鍵是將…

Apache poi 導出多sheet的excel表格_朋態圈的博客

導出多sheet的excel */public class ApachePoi { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub exportExcel();} @SuppressWarnings(“resource”) public static String exportExcel…

java導出excel限制大小_解決java poi導出excel2003不能超過65536行的問題

/*** 如果達到50000條數據則重新創建工作表的邏輯*/@Overridepublic void exportExcel(ListformList, ServletOutputStream outputStream){try{//工作表名後面的數字,如表1,表2int i = 0;//記錄總行數int rownum = 0;//記錄每個sheet的行數int tempnum = 0;//分頁條…

繼續訪問

熱門推薦 java poi 導出Excel 超大數據量解決方案

繼續訪問

poi導出excel,實現一個excel中多個sheet(可解決poi導出限制65536的問題…

本文章的excel實現導出多個sheet是在上一篇poi導出的基礎上實現的,這麼久了,對於上一篇文章的poi也作出過一些優化。 這裡我只貼修改了的方法的代碼,其餘的和上一篇文章的一樣。 /** * 導出excel.在一個頁面中單獨導出Excel …

基於Apache POI導出(百萬級)大數據量Excel的實現_一朵風中搖曳的水仙…

支持單個 excel 的 sheet 導出100w 的數據 ApachePOI操作Excel對象 1.HSSF:操作Excel 2007之前版本(.xls)格式,生成的EXCEL不經過壓縮直接導出 2.XSSF:操作Excel 2007及之後版本(.xlsx)格式,內存佔用高於HSSF …

解決POI的XSSFWorkbook導入大excel的內存消耗過大問題

方式1:使用SXSSFWorkbook ,經過測試,這個情況無效,因為本質上SXSSFWorkbook 也是通過XSSFWorkbook來的,他可以解決寫出excel的場景,但是解決不了我們這種用戶上傳且讀取excel中的內容的場景 XSSFWorkbook XSSFWorkbook = new XSSFWorkbook(fileInputStream); System.gc(); SXSSFWorkbook SXSSFWorkbook = new SXSS

繼續訪問

導入導出

原文地址: 創建流程:(上級為 下級的載體) 1:.創建 工作簿 2.創建 sheet(可以創建多個) 3.創建行 4.創建單元格 接下來 分別說下 工作簿的常用三種形式的區別,他們分別是 1.HSSFWorkbook 2.XSSFWorkbook 3.SXSSFWork…

繼續訪問

NPOI導出Excel 65536限制

1 #region NPOI 導出excel數據超65535自動分表 2 /// summary 3 /// DataTable轉換成Excel文檔流,並輸出到客戶端 4 /// /summary 5 /// param name=”table”…

繼續訪問

java導出csv文件 為解決導出excel時每個單元格的限制(32767)

此實現方法僅供參考 因為本人導出數據量不大所採取的方法 如數據量大,會到至內存溢出請知曉 在這還提下:導出時內容自己換行 只需在內容前尾各加雙引號就行。 如圖 1、準備導出工具類 // An highlighted block package com.test; import java.io.BufferedWriter; import java.io.File; import java.io…

繼續訪問

Excel單元格數據超過32767報錯問題處理

java poi 32767

繼續訪問

SXSSFWorkbook Excel 大量數據導出

注意 SXSSFWorkbook 用於大量數據的導出 SXSSFWorkbook是用來生成海量excel數據文件,主要原理是藉助臨時存儲空間生成excel, SXSSFWorkbook專門處理大數據,對於大型excel的創建且不會內存溢出的,就只SXSSFWorkbook了。 它的原理很簡單,用硬盤空間換內存(就像hashmap用空間換時間一樣)。 SXSSFWorkbook是streami…

繼續訪問

EXCEL大數據量導出的解決方案

將web頁面上顯示的報表導出到excel文件里是一種很常見的需求。然而,當數據量較大的情況下,excel本身的支持最多65535行數據的問題便凸顯出來。下面就給出大數據量導出到excel的解決方 案。 首先,對於數據超過了65535行的問題,很自然的就會想到將整個數據分塊,利用excel的多sheet頁的功能,將超出65535行後的數據寫入到下一個sheet頁中,即通過多sheet頁的方式,突破了…

繼續訪問

幾行代碼,複雜Excel 導入導出,真心強大!

點擊上方藍色字體,選擇“標星公眾號”優質文章,第一時間送達項目中使用:功能介紹IMPORT1、 ExcelHandle核心處理器;2、 ExcelWorkbookManageexcel所有工作表管理;3、 ExcelInitConfig配置文件初始化;4、 AbstractFileParser文件轉換類;alanpoi import有何優勢?1、 用戶不需要額外引入poi…

繼續訪問

java中poi導出excel問題總結

java中poi導出excel問題總結

繼續訪問

java POI導出excel,列數限制在256列

有兩篇文章寫得比較好的

繼續訪問

apache poi導出excel最大多少個sheet

大數據導出excel大小限制

寫評論

評論

收藏

點贊

分享

java導出excel圖表

通過Java程序導出帶圖表的excel嗎?參考下面用spire.xls.jar來創建Excel圖表的方法,這裡以創建餅圖為例,當然你也可以指定創建其他圖表類型,如柱狀圖、折線圖、雷達圖、散點圖等等:

import com.spire.xls.*;

import com.spire.xls.charts.ChartSerie;

import java.awt.*;

public class CreatePieChart {

public static void main(String[] args) {

//創建Workbook對象

Workbook workbook = new Workbook();

//獲取第一個工作表

Worksheet sheet = workbook.getWorksheets().get(0);

//將圖表數據寫入工作表

sheet.getCellRange(“A1”).setValue(“年份”);

sheet.getCellRange(“A2”).setValue(“2002”);

sheet.getCellRange(“A3”).setValue(“2003”);

sheet.getCellRange(“A4”).setValue(“2004”);

sheet.getCellRange(“A5”).setValue(“2005”);

sheet.getCellRange(“B1”).setValue(“銷售額”);

sheet.getCellRange(“B2”).setNumberValue(4000);

sheet.getCellRange(“B3”).setNumberValue(6000);

sheet.getCellRange(“B4”).setNumberValue(7000);

sheet.getCellRange(“B5”).setNumberValue(8500);

//設置單元格樣式

sheet.getCellRange(“A1:B1”).setRowHeight(15);

sheet.getCellRange(“A1:B1”).getCellStyle().setColor(Color.darkGray);

sheet.getCellRange(“A1:B1”).getCellStyle().getExcelFont().setColor(Color.white);

sheet.getCellRange(“A1:B1”).getCellStyle().setVerticalAlignment(VerticalAlignType.Center);

sheet.getCellRange(“A1:B1”).getCellStyle().setHorizontalAlignment(HorizontalAlignType.Center);

sheet.getCellRange(“B2:C5”).getCellStyle().setNumberFormat(“\”¥\”#,##0”);

//添加餅圖

Chart chart = sheet.getCharts().add(ExcelChartType.Pie);

//設置圖表數據區域

chart.setDataRange(sheet.getCellRange(“B2:B5”));

chart.setSeriesDataFromRange(false);

//設置圖表位置

chart.setLeftColumn(3);

chart.setTopRow(1);

chart.setRightColumn(11);

     chart.setBottomRow(20);

//設置圖表標題

chart.setChartTitle(“年銷售額”);

chart.getChartTitleArea().isBold(true);

chart.getChartTitleArea().setSize(12);

//設置系列標籤

ChartSerie cs = chart.getSeries().get(0);

cs.setCategoryLabels(sheet.getCellRange(“A2:A5”));

cs.setValues(sheet.getCellRange(“B2:B5”));

cs.getDataPoints().getDefaultDataPoint().getDataLabels().hasValue(true);

chart.getPlotArea().getFill().setVisible(false);

 //保存文檔

workbook.saveToFile(“output/PieChart.xlsx”, ExcelVersion.Version2016);

}

}

餅圖創建效果:

excel餅狀圖效果

怎麼用java實現導出excel

/**

 * @author liuwu

 * Excel的導入與導出

 */

@SuppressWarnings({ “unchecked” })

public class ExcelOperate {

/**

 * @author liuwu

 * 這是一個通用的方法,利用了JAVA的反射機制,

 * 可以將放置在JAVA集合中並且符合一定條件的數據以EXCEL的形式輸出到指定IO設備上

 * @param title 表格標題名

 * @param headers 表格屬性列名數組

 * @param dataset 需要顯示的數據集合,集合中一定要放置符合javabean風格的類的對象。

 *  此方法支持的 javabean屬性【數據類型有java基本數據類型及String,Date,byte[](圖片轉成字節碼)】

 * @param out 與輸出設備關聯的流對象,可以將EXCEL文檔導出到本地文件或者網絡中

 * @param pattern  如果有時間數據,設定輸出格式。默認為”yyy-MM-dd”

 * @throws IOException 

 */

public static void exportExcel(String title, String[] headers,Collection? dataset, OutputStream out, String pattern) throws IOException {

// 聲明一個工作薄

HSSFWorkbook workbook = new HSSFWorkbook();

// 生成一個表格

HSSFSheet sheet = workbook.createSheet(title);

// 設置表格默認列寬度為15個字節

sheet.setDefaultColumnWidth((short) 20);

// 生成一個樣式

HSSFCellStyle style = workbook.createCellStyle();

// 設置這些樣式

style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);

style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

style.setBorderBottom(HSSFCellStyle.BORDER_THIN);

style.setBorderLeft(HSSFCellStyle.BORDER_THIN);

style.setBorderRight(HSSFCellStyle.BORDER_THIN);

style.setBorderTop(HSSFCellStyle.BORDER_THIN);

style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

// 生成一個字體

HSSFFont font = workbook.createFont();

font.setColor(HSSFColor.VIOLET.index);

font.setFontHeightInPoints((short) 12);

font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

// 把字體應用到當前的樣式

style.setFont(font);

// 生成並設置另一個樣式

HSSFCellStyle style2 = workbook.createCellStyle();

style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);

style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);

style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);

style2.setBorderRight(HSSFCellStyle.BORDER_THIN);

style2.setBorderTop(HSSFCellStyle.BORDER_THIN);

style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);

style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

// 生成另一個字體

HSSFFont font2 = workbook.createFont();

font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);

// 把字體應用到當前的樣式

style2.setFont(font2);

// 產生表格標題行

HSSFRow row = sheet.createRow(0);

for (short i = 0; i  headers.length; i++) {

HSSFCell cell = row.createCell(i);

cell.setCellStyle(style);

HSSFRichTextString text = new HSSFRichTextString(headers[i]);

cell.setCellValue(text);

}

// 遍歷集合數據,產生數據行

Iterator? it = dataset.iterator();

int index = 0;

while (it.hasNext()) {

index++;

row = sheet.createRow(index);

Object t =  it.next();

// 利用反射,根據javabean屬性的先後順序,動態調用getXxx()方法得到屬性值

Field[] fields = t.getClass().getDeclaredFields();

for (short i = 0; i  fields.length; i++) {

HSSFCell cell = row.createCell(i);

cell.setCellStyle(style2);

Field field = fields[i];

String fieldName = field.getName();

String getMethodName = “get”

+ fieldName.substring(0, 1).toUpperCase()

+ fieldName.substring(1);//注意 實體get Set不要自己改名字不然反射會有問題

try {

Class tCls = t.getClass();

Method getMethod = tCls.getMethod(getMethodName,new Class[] {});

Object value = getMethod.invoke(t, new Object[] {});

HSSFRichTextString richString = new HSSFRichTextString(value.toString());

HSSFFont font3 = workbook.createFont();

font3.setColor(HSSFColor.BLUE.index);

richString.applyFont(font3);

cell.setCellValue(richString);

} catch (SecurityException e) {

e.printStackTrace();

e=null;

} catch (NoSuchMethodException e) {

e.printStackTrace();

e=null;

} catch (IllegalArgumentException e) {

e.printStackTrace();

e=null;

} catch (IllegalAccessException e) {

e.printStackTrace();

e=null;

} catch (InvocationTargetException e) {

e.printStackTrace();

e=null;

} finally {

// 清理資源

}

}

}

try {

workbook.write(out);

} catch (IOException e) {

e.printStackTrace();

e=null;

}

}

}

java怎麼實現導出excel

偶將最近寫了兩個導出excel的方法,第一個是面向過程的思路,就是在指定的單元格寫入指定的值,如下:

/**

*負責數據導入到EXCEL

*

* @param realPath

* EXCEL表格存放的絕對路徑

* @param sheetname

*

* @param xLocation

* EXCEL表格的行索引,從1開始

* @param yLocation

* EXCEL表格的列索引,從1開始

* @param value

* 需要導入的數據

*

*/

public void modifyExcel(String realPath,String sheetname,int xLocaion,int yLocation,String value){

POIFSFileSystem fs=null;

HSSFWorkbook wb=null;

try {

File file=new File(realPath);

if(file.exists()){

fs = new POIFSFileSystem(new FileInputStream(realPath));

wb=new HSSFWorkbook(fs);

HSSFSheet s=wb.getSheetAt(0);

//函數處理時橫縱坐標從索引0開始

HSSFRow row=s.getRow(xLocaion-1);

HSSFCell cell=null;

if(row!=null){

cell=row.getCell(yLocation-1);

if(cell==null){

cell=row.createCell(yLocation-1);

}

}else{

row=s.createRow(xLocaion-1);

cell=row.createCell(yLocation-1);

}

cell.setCellValue(value);

}else{

wb=new HSSFWorkbook();

HSSFSheet s=wb.createSheet();

wb.setSheetName(0, sheetname);

HSSFRow row=s.createRow(xLocaion-1);

HSSFCell cell=row.createCell(yLocation-1);

cell.setCellValue(value);

}

FileOutputStream fos=new FileOutputStream(realPath);

wb.write(fos);

fos.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

第二種就是運用了對象,以對象為單位寫入數據,即一個對象的所有屬性在一行列出,有多少個對象就有多少行,此方法比較適用於個人信息導出之類的應用,至於導出屬性的順序問題在導出對象的實體類內部改動下即可:

/**

*負責數據導入到EXCEL

*

* @param realPath

* EXCEL表格存放的絕對路徑

* @param sheetname

*

* @param users

* 需要導出到excel表的對象數組

*/

public void outputExcel(String realPath,String sheetname,UserModel[] users){

FileOutputStream fos;

try {

File file=new File(realPath);

fos = new FileOutputStream(file, true);

HSSFWorkbook wb = new HSSFWorkbook();

HSSFSheet s=wb.createSheet();

wb.setSheetName(0, sheetname);

HSSFRow[] rows=new HSSFRow[users.length];

HSSFCell[][] cells=new HSSFCell[20][20];

for (int i=0; iusers.length;i++) { // 相當於excel表格中的總行數

PropertyDescriptor[] descriptors=getAvailablePropertyDescriptors(users[i]);

rows[i]=s.createRow(i);

for (int j=0; descriptors!=nulljdescriptors.length;j++) {

java.lang.reflect.Method readMethod = descriptors[j]

.getReadMethod();

cells[i][j]=rows[i].createCell(j);

Object value=readMethod.invoke(users[i], null);

cells[i][j].setCellValue(value.toString());

}

}

wb.write(fos);

fos.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

原創文章,作者:SCYG,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/137353.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
SCYG的頭像SCYG
上一篇 2024-10-04 00:17
下一篇 2024-10-04 00:17

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論