開發(fā)中經(jīng)常會(huì)設(shè)計(jì)到excel的處理,如導(dǎo)出Excel,導(dǎo)入Excel到數(shù)據(jù)庫(kù)中,操作Excel目前有兩個(gè)框架,一個(gè)是apache 的poi, 另一個(gè)是 Java Excel
Apache POI 簡(jiǎn)介是用Java編寫的免費(fèi)開源的跨平臺(tái)的 Java API,Apache POI提供API給Java程式對(duì)Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式檔案讀和寫的功能。POI為“Poor Obfuscation Implementation”的首字母縮寫,意為“可憐的模糊實(shí)現(xiàn)”。
官方主頁: http://poi.apache.org/index.html
API文檔: http://poi.apache.org/apidocs/index.html
Java Excel是一開放源碼項(xiàng)目,通過它Java開發(fā)人員可以讀取Excel文件的內(nèi)容、創(chuàng)建新的Excel文件、更新已經(jīng)存在的Excel文件。jxl 由于其小巧 易用的特點(diǎn), 逐漸已經(jīng)取代了 POI-excel的地位, 成為了越來越多的java開發(fā)人員生成excel文件的首選。
由于apache poi 在項(xiàng)目中用的比較多,本篇博客只講解apache poi,不講jxl
在開發(fā)中我們經(jīng)常使用HSSF用來操作Excel處理表格數(shù)據(jù),對(duì)于其它的不經(jīng)常使用。
HSSF 是Horrible SpreadSheet Format的縮寫,通過HSSF,你可以用純Java代碼來讀取、寫入、修改Excel文件。HSSF 為讀取操作提供了兩類API:usermodel和eventusermodel,即“用戶模型”和“事件-用戶模型”。
常用的類和方法
Excel中的工作簿、工作表、行、單元格中的關(guān)系:
首先引入apache poi的依賴
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
示例一:在桌面上生成一個(gè)Excel文件
public static void createExcel() throws IOException{
// 獲取桌面路徑
FileSystemView fsv=FileSystemView.getFileSystemView();
String desktop=fsv.getHomeDirectory().getPath();
String filePath=desktop + "/template.xls";
File file=new File(filePath);
OutputStream outputStream=new FileOutputStream(file);
HSSFWorkbook workbook=new HSSFWorkbook();
HSSFSheet sheet=workbook.createSheet("Sheet1");
HSSFRow row=sheet.createRow(0);
row.createCell(0).setCellValue("id");
row.createCell(1).setCellValue("訂單號(hào)");
row.createCell(2).setCellValue("下單時(shí)間");
row.createCell(3).setCellValue("個(gè)數(shù)");
row.createCell(4).setCellValue("單價(jià)");
row.createCell(5).setCellValue("訂單金額");
row.setHeightInPoints(30); // 設(shè)置行的高度
HSSFRow row1=sheet.createRow(1);
row1.createCell(0).setCellValue("1");
row1.createCell(1).setCellValue("NO00001");
// 日期格式化
HSSFCellStyle cellStyle2=workbook.createCellStyle();
HSSFCreationHelper creationHelper=workbook.getCreationHelper();
cellStyle2.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
sheet.setColumnWidth(2, 20 * 256); // 設(shè)置列的寬度
HSSFCell cell2=row1.createCell(2);
cell2.setCellStyle(cellStyle2);
cell2.setCellValue(new Date());
row1.createCell(3).setCellValue(2);
// 保留兩位小數(shù)
HSSFCellStyle cellStyle3=workbook.createCellStyle();
cellStyle3.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
HSSFCell cell4=row1.createCell(4);
cell4.setCellStyle(cellStyle3);
cell4.setCellValue(29.5);
// 貨幣格式化
HSSFCellStyle cellStyle4=workbook.createCellStyle();
HSSFFont font=workbook.createFont();
font.setFontName("華文行楷");
font.setFontHeightInPoints((short)15);
font.setColor(HSSFColor.RED.index);
cellStyle4.setFont(font);
HSSFCell cell5=row1.createCell(5);
cell5.setCellFormula("D2*E2"); // 設(shè)置計(jì)算公式
// 獲取計(jì)算公式的值
HSSFFormulaEvaluator e=new HSSFFormulaEvaluator(workbook);
cell5=e.evaluateInCell(cell5);
System.out.println(cell5.getNumericCellValue());
workbook.setActiveSheet(0);
workbook.write(outputStream);
outputStream.close();
}
示例2:讀取Excel,解析數(shù)據(jù)
public static void readExcel() throws IOException{
FileSystemView fsv=FileSystemView.getFileSystemView();
String desktop=fsv.getHomeDirectory().getPath();
String filePath=desktop + "/template.xls";
FileInputStream fileInputStream=new FileInputStream(filePath);
BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
POIFSFileSystem fileSystem=new POIFSFileSystem(bufferedInputStream);
HSSFWorkbook workbook=new HSSFWorkbook(fileSystem);
HSSFSheet sheet=workbook.getSheet("Sheet1");
int lastRowIndex=sheet.getLastRowNum();
System.out.println(lastRowIndex);
for (int i=0; i <=lastRowIndex; i++) {
HSSFRow row=sheet.getRow(i);
if (row==null) { break; }
short lastCellNum=row.getLastCellNum();
for (int j=0; j < lastCellNum; j++) {
String cellValue=row.getCell(j).getStringCellValue();
System.out.println(cellValue);
}
}
bufferedInputStream.close();
}
1、導(dǎo)出示例
@SuppressWarnings("resource")
@RequestMapping("/export")
public void exportExcel(HttpServletResponse response, HttpSession session, String name) throws Exception {
String[] tableHeaders={"id", "姓名", "年齡"};
HSSFWorkbook workbook=new HSSFWorkbook();
HSSFSheet sheet=workbook.createSheet("Sheet1");
HSSFCellStyle cellStyle=workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
Font font=workbook.createFont();
font.setColor(HSSFColor.RED.index);
font.setBold(true);
cellStyle.setFont(font);
// 將第一行的三個(gè)單元格給合并
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
HSSFRow row=sheet.createRow(0);
HSSFCell beginCell=row.createCell(0);
beginCell.setCellValue("通訊錄");
beginCell.setCellStyle(cellStyle);
row=sheet.createRow(1);
// 創(chuàng)建表頭
for (int i=0; i < tableHeaders.length; i++) {
HSSFCell cell=row.createCell(i);
cell.setCellValue(tableHeaders[i]);
cell.setCellStyle(cellStyle);
}
List<User> users=new ArrayList<>();
users.add(new User(1L, "張三", 20));
users.add(new User(2L, "李四", 21));
users.add(new User(3L, "王五", 22));
for (int i=0; i < users.size(); i++) {
row=sheet.createRow(i + 2);
User user=users.get(i);
row.createCell(0).setCellValue(user.getId());
row.createCell(1).setCellValue(user.getName());
row.createCell(2).setCellValue(user.getAge());
}
OutputStream outputStream=response.getOutputStream();
response.reset();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=template.xls");
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
}
2、導(dǎo)入示例
1、使用SpringMVC上傳文件,需要用到commons-fileupload
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
2、需要在spring的配置文件中配置一下multipartResolver
<bean name="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
</bean>
3、index.jsp
<a href="/Spring-Mybatis-Druid/user/export">導(dǎo)出</a> <br/>
<form action="/Spring-Mybatis-Druid/user/import" enctype="multipart/form-data" method="post">
<input type="file" name="file"/>
<input type="submit" value="導(dǎo)入Excel">
</form>
4、解析上傳的.xls文件
@SuppressWarnings("resource")
@RequestMapping("/import")
public void importExcel(@RequestParam("file") MultipartFile file) throws Exception{
InputStream inputStream=file.getInputStream();
BufferedInputStream bufferedInputStream=new BufferedInputStream(inputStream);
POIFSFileSystem fileSystem=new POIFSFileSystem(bufferedInputStream);
HSSFWorkbook workbook=new HSSFWorkbook(fileSystem);
//HSSFWorkbook workbook=new HSSFWorkbook(file.getInputStream());
HSSFSheet sheet=workbook.getSheetAt(0);
int lastRowNum=sheet.getLastRowNum();
for (int i=2; i <=lastRowNum; i++) {
HSSFRow row=sheet.getRow(i);
int id=(int) row.getCell(0).getNumericCellValue();
String name=row.getCell(1).getStringCellValue();
int age=(int) row.getCell(2).getNumericCellValue();
System.out.println(id + "-" + name + "-" + age);
}
}
導(dǎo)出效果:
導(dǎo)入效果:
實(shí)戰(zhàn)錄》導(dǎo)語
云端衛(wèi)士《實(shí)戰(zhàn)錄》欄目定期會(huì)向粉絲朋友們分享一些在開發(fā)運(yùn)維中的經(jīng)驗(yàn)和技巧,2017年我們將一如既往地為朋友們奉獻(xiàn)更多優(yōu)質(zhì)內(nèi)容。本期分享人為云端衛(wèi)士安全運(yùn)營(yíng)工程師史懷周,主要介紹Java中多重格式報(bào)表導(dǎo)出方案比較。
系統(tǒng)中經(jīng)常存在導(dǎo)出報(bào)告的需求,而導(dǎo)出的框架五花八門,該如何選擇呢?
本文對(duì)幾種常見的框架進(jìn)行比較,希望可以在遇到導(dǎo)出需求時(shí),為你提供一些參考。常見的導(dǎo)出格式包括Word、 Excel和PDF等,下面針對(duì)對(duì)這三種格式進(jìn)行說明。
Word
Word一般用于導(dǎo)出包含圖片,表格等的分析匯總類報(bào)告。
1.JACOB
jacob的原理是使用自帶的DLL動(dòng)態(tài)鏈接庫(kù),通過JNDI的方式實(shí)現(xiàn)對(duì)COM程序的調(diào)用。它要求主機(jī)必須是Windows平臺(tái),當(dāng)大量請(qǐng)求同時(shí)操作時(shí),有一定幾率做成office資源的死鎖。種種情況都是我們不能接受的,所以適用面不廣。
2.java2word
java2word是通過java api調(diào)用MS Office文檔的組件。可以實(shí)現(xiàn)打開文檔,創(chuàng)建文檔,插入圖片,創(chuàng)建表格等多種操作。但同樣的,必須要在Windows平臺(tái)上才能使用。所以也不納入考慮范圍。
3.POI
POI出了可以導(dǎo)出Excel,還可以導(dǎo)出Word。相信很多人壓根沒有想到,但是POI對(duì)word的支持十分有限,不能設(shè)置樣式。如果導(dǎo)出的報(bào)表格式比較復(fù)雜,這種方案也是愛莫能助的。
4.FreeMarker
Freemarker是模板工具,而word是文檔,兩者如何搭配呢?其實(shí)很簡(jiǎn)單。word允許通過Office轉(zhuǎn)換成標(biāo)準(zhǔn)XML格式,而word中的內(nèi)容就是一個(gè)個(gè)的xml標(biāo)簽。
所以我們可以先用office制作word模板,另存為xml之后,將其中的需要?jiǎng)討B(tài)生成的部分改成變量,再通過freemarker生成即可(注意生成的文件后綴名要改為.doc或.docx)。而word中的圖片該怎么處理呢?word中的圖片是以base64存儲(chǔ)的,所以只要將圖片轉(zhuǎn)換為base64,然后放在對(duì)應(yīng)的變量上就可以了。
這種方式的最大缺點(diǎn)是word轉(zhuǎn)為xml格式后,結(jié)構(gòu)相對(duì)復(fù)雜,模板的制作比較麻煩。但綜合來說,這是最佳的Word導(dǎo)出方案。
Excel
Excel通常用來導(dǎo)出數(shù)據(jù)類型的報(bào)表。比如某段時(shí)間內(nèi)的DDoS攻擊流量匯總等。Excel的導(dǎo)出比較常見,網(wǎng)上案例也比較多,大部分都使用JXL或POI這兩個(gè)工具。
1.JXL
JXL對(duì)中文支持很好,且操作簡(jiǎn)單。支持圖片和圖表,但是支持有限,而且圖片只支持PNG格式。大數(shù)據(jù)量Excel導(dǎo)出時(shí)的效率較差。
2.POI
POI在Excel導(dǎo)出中應(yīng)該是最常用的方案了。它對(duì)Excel的很全面,支持使用公式、宏。對(duì)格式支持很好,可以任意定義單元格的格式。同時(shí)在大數(shù)據(jù)量Excel的生成上,效率很高。
PDF1.jasper report
jasper report是比較常用的一種生成PDF的方式。它的設(shè)計(jì)思路是先生成模板,再將數(shù)據(jù)嵌入模板中。它的缺點(diǎn)是模板生成復(fù)雜,規(guī)則眾多,需要借助IDE的可視化工具進(jìn)行編輯,入門和使用都比較困難。
2.itext
iText是十分好用的一個(gè)PDF開源軟件。支持使用圖片、HTML頁面和直接用Java代碼等多種方式生成PDF。IText的API很豐富,對(duì)PDF的格式支持很好。iText有一個(gè)顯著的缺點(diǎn),對(duì)HTML的格式要求特別嚴(yán)格,且無法識(shí)別很多html的tag和attribute,無法識(shí)別css,需要使用API函數(shù)來設(shè)置樣式。如果想要使用HTML直接生成PDF,IText的缺點(diǎn)確認(rèn)是讓人抓狂。在HTML上畫樣式要比使用API一行一行繪制PDF樣式簡(jiǎn)單的多。怎么辦呢?如果你有一個(gè)可訪問的頁面地址,你可以試試使用下面的方式。
3.iText+phantomjs
PhantomJS 是一個(gè)基于 WebKit 的服務(wù)器端 JavaScript API。PhantomJS可以用于頁面自動(dòng)化,網(wǎng)絡(luò)監(jiān)測(cè),網(wǎng)頁截屏,以及無界面測(cè)試等。我們可以通過它對(duì)要生成PDF的URL截屏,然后將圖片轉(zhuǎn)成PDF。這種方式的缺點(diǎn)是,生成的PDF內(nèi)的文字全部不可選中,沒辦法復(fù)制其中內(nèi)容。
4.iText+flying sauser
flying sauser是基于IText的一個(gè)開源軟件。它解決了iText對(duì)HTML支持弱的痛點(diǎn)。而且生成的PDF內(nèi)容全部可以選中復(fù)制。缺點(diǎn)是它仍然對(duì)HTML格式要求嚴(yán)格。
文件開頭必須是
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
所有的標(biāo)簽必須閉合。特殊字符需要使用<![CDATA[]]>括起來。但和前面幾種方案比起來,這仍然算是比較優(yōu)秀的解決方案了。b( ̄▽ ̄)d
下是江西教育考試院公布的江西省2020年具備高職單招資格的學(xué)校名單,共計(jì)62所,供大家參考:
序號(hào) 高校名稱 高校招生簡(jiǎn)章網(wǎng)址
1江西科技學(xué)院http://zjc.jxut.edu.cn/ygzs.htm
2南昌理工學(xué)院http://zsb.nut.edu.cn
3江西服裝學(xué)院http://bm.jift.edu.cn/dz/
4南昌工學(xué)院http://zsb.ncpu.edu.cn/
5江西工程學(xué)院http://zsc.jxue.edu.cn
6江西應(yīng)用科技學(xué)院http://www.jxcsedu.com/zhaosheng/
7南昌職業(yè)大學(xué)http://zsb.nczyxy.com
8江西軟件職業(yè)技術(shù)大學(xué)https://www.jxuspt.com/Z07_ZSJY/zhzoshengianjie.jsp
9江西醫(yī)學(xué)高等專科學(xué)校http://zsjy.jxyxgz.cn/
10宜春幼兒師范高等專科學(xué)校http://www.gacycu.cn/newsshow.asp?id=1670
11江西師范高等專科學(xué)校http://www.jxsfgz.com/zsb
12上饒幼兒師范高等專科學(xué)校http://www.srygz.cn/nd.jsp?id=63
13撫州幼兒師范高等專科學(xué)校http://www.fzpec.cn/show-61-1398-1.html
14九江職業(yè)大學(xué)http://zsc.jjvu.jx.cn/index.aspx
15九江職業(yè)技術(shù)學(xué)院http://ddzs.zbrcw.cn/
16江西工業(yè)職業(yè)技術(shù)學(xué)院http://zsw.jxgzy.cn
17江西電力職業(yè)技術(shù)學(xué)院http://www.jxdlzy.com
18江西旅游商貿(mào)職業(yè)學(xué)院http://zsb.jxlsxy.com
19江西機(jī)電職業(yè)技術(shù)學(xué)院http://zs.jxjdxy.edu.cn/html/zhaoshengxinxi/index.html
20江西陶瓷工藝美術(shù)職業(yè)技術(shù)學(xué)院www.jxgymy.com
21江西環(huán)境工程職業(yè)學(xué)院www.jxhjxy.com
22江西信息應(yīng)用職業(yè)技術(shù)學(xué)院http://www.jxcia.com
23江西工業(yè)工程職業(yè)技術(shù)學(xué)院http://www.jxgcxy.net
24江西交通職業(yè)技術(shù)學(xué)院https://zsb.jxjtxy.edu.cn
25江西藝術(shù)職業(yè)學(xué)院https://www.jxysedu.com
26江西財(cái)經(jīng)職業(yè)學(xué)院http://www.jxvc.jx.cn/
27江西司法警官職業(yè)學(xué)院www.jxsfjy.cn
28江西應(yīng)用技術(shù)職業(yè)學(xué)院http://www.jxyy.edu.cn/zsw/
29江西現(xiàn)代職業(yè)技術(shù)學(xué)院http://zsw.jxxdxy.edu.cn/
30江西外語外貿(mào)職業(yè)學(xué)院http://zs.jxcfs.com/
31江西工業(yè)貿(mào)易職業(yè)技術(shù)學(xué)院http://zsc.jxgmxy.com/
32江西應(yīng)用工程職業(yè)學(xué)院http://zsc.jxatei.net/
33江西建設(shè)職業(yè)技術(shù)學(xué)院http://www.jxjsxy.edu.cn/news-list-zhaojshengfzhuanflany.html
34宜春職業(yè)技術(shù)學(xué)院http://zs.ycvc.jx.cn
35撫州職業(yè)技術(shù)學(xué)院http://www.fzjsxy.cn/
36江西生物科技職業(yè)學(xué)院http://zsw.jxswkj.com/ddzs.htm
37江西衛(wèi)生職業(yè)學(xué)院http://zsw.jxhlxy.com.cn
38江西青年職業(yè)學(xué)院http://zs.jxqy.edu.cn/
39上饒職業(yè)技術(shù)學(xué)院http://zs.srzy.cn/news-list-zhaoshengjianzhang.html
40江西農(nóng)業(yè)工程職業(yè)學(xué)院http://www.jxaevc.com
41江西科技職業(yè)學(xué)院http://www.jxkeda.com/
42江西航空職業(yè)技術(shù)學(xué)院http://www.jhxy.com.cn/?a=web.articles&uid=9059&id=3864
43贛西科技職業(yè)學(xué)院www.ganxidx.com
44江西制造職業(yè)技術(shù)學(xué)院http://www.jxmtc.com/
45江西工程職業(yè)學(xué)院http://www.jxrtvu.com/gczyxy/2020/0216/c185a19015/page.html
46江西泰豪動(dòng)漫職業(yè)學(xué)院https://www.thdm.edu.cn/
47江西楓林涉外經(jīng)貿(mào)職業(yè)學(xué)院http://www.fenglin.org
48江西傳媒職業(yè)學(xué)院http://zsc.jxmvc.cn/
49江西冶金職業(yè)技術(shù)學(xué)院http://zs.jxyjxy.com/
50江西新能源科技職業(yè)學(xué)院http://www.tynxy.com/
51江西工商職業(yè)技術(shù)學(xué)院http://www.jxgsxy.net/Item/list.asp?id=351
52景德鎮(zhèn)陶瓷職業(yè)技術(shù)學(xué)院http://www.jcivt.com/zsc/index.asp
53共青科技職業(yè)學(xué)院www.gqkj.com.cn
54江西水利職業(yè)學(xué)院https://mp.weixin.qq.com/s/FdP8ZOaXkwu3F0ry5mZLgg
55吉安職業(yè)技術(shù)學(xué)院http://www.japt.com.cn/zsxxw/info/1078/1262.htm
56江西洪州職業(yè)學(xué)院www.jxhzxy.com
57南昌影視傳播職業(yè)學(xué)院http://www.ncyscb.com/
58贛南衛(wèi)生健康職業(yè)學(xué)院http://zsjy.gnhvc.cn/zs.asp
59萍鄉(xiāng)衛(wèi)生職業(yè)學(xué)院http://www.pxhvc.com/
60江西婺源茶業(yè)職業(yè)學(xué)院http://jxtvc.com/Item/list.asp?id=1770
61江西經(jīng)濟(jì)管理干部學(xué)院http://zsb.jiea.cn/
62贛州職業(yè)技術(shù)學(xué)院http://www.gzpt.edu.cn/
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。