Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
開發中經常會設計到excel的處理,如導出Excel,導入Excel到數據庫中,操作Excel目前有兩個框架,一個是apache 的poi, 另一個是 Java Excel
Apache POI 簡介是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式檔案讀和寫的功能。POI為“Poor Obfuscation Implementation”的首字母縮寫,意為“可憐的模糊實現”。
官方主頁: http://poi.apache.org/index.html
API文檔: http://poi.apache.org/apidocs/index.html
Java Excel是一開放源碼項目,通過它Java開發人員可以讀取Excel文件的內容、創建新的Excel文件、更新已經存在的Excel文件。jxl 由于其小巧 易用的特點, 逐漸已經取代了 POI-excel的地位, 成為了越來越多的java開發人員生成excel文件的首選。
由于apache poi 在項目中用的比較多,本篇博客只講解apache poi,不講jxl
在開發中我們經常使用HSSF用來操作Excel處理表格數據,對于其它的不經常使用。
HSSF 是Horrible SpreadSheet Format的縮寫,通過HSSF,你可以用純Java代碼來讀取、寫入、修改Excel文件。HSSF 為讀取操作提供了兩類API:usermodel和eventusermodel,即“用戶模型”和“事件-用戶模型”。
常用的類和方法
Excel中的工作簿、工作表、行、單元格中的關系:
首先引入apache poi的依賴
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
示例一:在桌面上生成一個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("訂單號");
row.createCell(2).setCellValue("下單時間");
row.createCell(3).setCellValue("個數");
row.createCell(4).setCellValue("單價");
row.createCell(5).setCellValue("訂單金額");
row.setHeightInPoints(30); // 設置行的高度
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); // 設置列的寬度
HSSFCell cell2=row1.createCell(2);
cell2.setCellStyle(cellStyle2);
cell2.setCellValue(new Date());
row1.createCell(3).setCellValue(2);
// 保留兩位小數
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"); // 設置計算公式
// 獲取計算公式的值
HSSFFormulaEvaluator e=new HSSFFormulaEvaluator(workbook);
cell5=e.evaluateInCell(cell5);
System.out.println(cell5.getNumericCellValue());
workbook.setActiveSheet(0);
workbook.write(outputStream);
outputStream.close();
}
示例2:讀取Excel,解析數據
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、導出示例
@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);
// 將第一行的三個單元格給合并
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);
// 創建表頭
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、導入示例
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">導出</a> <br/>
<form action="/Spring-Mybatis-Druid/user/import" enctype="multipart/form-data" method="post">
<input type="file" name="file"/>
<input type="submit" value="導入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);
}
}
導出效果:
導入效果:
實戰錄》導語
云端衛士《實戰錄》欄目定期會向粉絲朋友們分享一些在開發運維中的經驗和技巧,2017年我們將一如既往地為朋友們奉獻更多優質內容。本期分享人為云端衛士安全運營工程師史懷周,主要介紹Java中多重格式報表導出方案比較。
系統中經常存在導出報告的需求,而導出的框架五花八門,該如何選擇呢?
本文對幾種常見的框架進行比較,希望可以在遇到導出需求時,為你提供一些參考。常見的導出格式包括Word、 Excel和PDF等,下面針對對這三種格式進行說明。
Word
Word一般用于導出包含圖片,表格等的分析匯總類報告。
1.JACOB
jacob的原理是使用自帶的DLL動態鏈接庫,通過JNDI的方式實現對COM程序的調用。它要求主機必須是Windows平臺,當大量請求同時操作時,有一定幾率做成office資源的死鎖。種種情況都是我們不能接受的,所以適用面不廣。
2.java2word
java2word是通過java api調用MS Office文檔的組件??梢詫崿F打開文檔,創建文檔,插入圖片,創建表格等多種操作。但同樣的,必須要在Windows平臺上才能使用。所以也不納入考慮范圍。
3.POI
POI出了可以導出Excel,還可以導出Word。相信很多人壓根沒有想到,但是POI對word的支持十分有限,不能設置樣式。如果導出的報表格式比較復雜,這種方案也是愛莫能助的。
4.FreeMarker
Freemarker是模板工具,而word是文檔,兩者如何搭配呢?其實很簡單。word允許通過Office轉換成標準XML格式,而word中的內容就是一個個的xml標簽。
所以我們可以先用office制作word模板,另存為xml之后,將其中的需要動態生成的部分改成變量,再通過freemarker生成即可(注意生成的文件后綴名要改為.doc或.docx)。而word中的圖片該怎么處理呢?word中的圖片是以base64存儲的,所以只要將圖片轉換為base64,然后放在對應的變量上就可以了。
這種方式的最大缺點是word轉為xml格式后,結構相對復雜,模板的制作比較麻煩。但綜合來說,這是最佳的Word導出方案。
Excel
Excel通常用來導出數據類型的報表。比如某段時間內的DDoS攻擊流量匯總等。Excel的導出比較常見,網上案例也比較多,大部分都使用JXL或POI這兩個工具。
1.JXL
JXL對中文支持很好,且操作簡單。支持圖片和圖表,但是支持有限,而且圖片只支持PNG格式。大數據量Excel導出時的效率較差。
2.POI
POI在Excel導出中應該是最常用的方案了。它對Excel的很全面,支持使用公式、宏。對格式支持很好,可以任意定義單元格的格式。同時在大數據量Excel的生成上,效率很高。
PDF1.jasper report
jasper report是比較常用的一種生成PDF的方式。它的設計思路是先生成模板,再將數據嵌入模板中。它的缺點是模板生成復雜,規則眾多,需要借助IDE的可視化工具進行編輯,入門和使用都比較困難。
2.itext
iText是十分好用的一個PDF開源軟件。支持使用圖片、HTML頁面和直接用Java代碼等多種方式生成PDF。IText的API很豐富,對PDF的格式支持很好。iText有一個顯著的缺點,對HTML的格式要求特別嚴格,且無法識別很多html的tag和attribute,無法識別css,需要使用API函數來設置樣式。如果想要使用HTML直接生成PDF,IText的缺點確認是讓人抓狂。在HTML上畫樣式要比使用API一行一行繪制PDF樣式簡單的多。怎么辦呢?如果你有一個可訪問的頁面地址,你可以試試使用下面的方式。
3.iText+phantomjs
PhantomJS 是一個基于 WebKit 的服務器端 JavaScript API。PhantomJS可以用于頁面自動化,網絡監測,網頁截屏,以及無界面測試等。我們可以通過它對要生成PDF的URL截屏,然后將圖片轉成PDF。這種方式的缺點是,生成的PDF內的文字全部不可選中,沒辦法復制其中內容。
4.iText+flying sauser
flying sauser是基于IText的一個開源軟件。它解決了iText對HTML支持弱的痛點。而且生成的PDF內容全部可以選中復制。缺點是它仍然對HTML格式要求嚴格。
文件開頭必須是
<!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">
所有的標簽必須閉合。特殊字符需要使用<![CDATA[]]>括起來。但和前面幾種方案比起來,這仍然算是比較優秀的解決方案了。b( ̄▽ ̄)d
下是江西教育考試院公布的江西省2020年具備高職單招資格的學校名單,共計62所,供大家參考:
序號 高校名稱 高校招生簡章網址
1江西科技學院http://zjc.jxut.edu.cn/ygzs.htm
2南昌理工學院http://zsb.nut.edu.cn
3江西服裝學院http://bm.jift.edu.cn/dz/
4南昌工學院http://zsb.ncpu.edu.cn/
5江西工程學院http://zsc.jxue.edu.cn
6江西應用科技學院http://www.jxcsedu.com/zhaosheng/
7南昌職業大學http://zsb.nczyxy.com
8江西軟件職業技術大學https://www.jxuspt.com/Z07_ZSJY/zhzoshengianjie.jsp
9江西醫學高等專科學校http://zsjy.jxyxgz.cn/
10宜春幼兒師范高等??茖W校http://www.gacycu.cn/newsshow.asp?id=1670
11江西師范高等專科學校http://www.jxsfgz.com/zsb
12上饒幼兒師范高等專科學校http://www.srygz.cn/nd.jsp?id=63
13撫州幼兒師范高等專科學校http://www.fzpec.cn/show-61-1398-1.html
14九江職業大學http://zsc.jjvu.jx.cn/index.aspx
15九江職業技術學院http://ddzs.zbrcw.cn/
16江西工業職業技術學院http://zsw.jxgzy.cn
17江西電力職業技術學院http://www.jxdlzy.com
18江西旅游商貿職業學院http://zsb.jxlsxy.com
19江西機電職業技術學院http://zs.jxjdxy.edu.cn/html/zhaoshengxinxi/index.html
20江西陶瓷工藝美術職業技術學院www.jxgymy.com
21江西環境工程職業學院www.jxhjxy.com
22江西信息應用職業技術學院http://www.jxcia.com
23江西工業工程職業技術學院http://www.jxgcxy.net
24江西交通職業技術學院https://zsb.jxjtxy.edu.cn
25江西藝術職業學院https://www.jxysedu.com
26江西財經職業學院http://www.jxvc.jx.cn/
27江西司法警官職業學院www.jxsfjy.cn
28江西應用技術職業學院http://www.jxyy.edu.cn/zsw/
29江西現代職業技術學院http://zsw.jxxdxy.edu.cn/
30江西外語外貿職業學院http://zs.jxcfs.com/
31江西工業貿易職業技術學院http://zsc.jxgmxy.com/
32江西應用工程職業學院http://zsc.jxatei.net/
33江西建設職業技術學院http://www.jxjsxy.edu.cn/news-list-zhaojshengfzhuanflany.html
34宜春職業技術學院http://zs.ycvc.jx.cn
35撫州職業技術學院http://www.fzjsxy.cn/
36江西生物科技職業學院http://zsw.jxswkj.com/ddzs.htm
37江西衛生職業學院http://zsw.jxhlxy.com.cn
38江西青年職業學院http://zs.jxqy.edu.cn/
39上饒職業技術學院http://zs.srzy.cn/news-list-zhaoshengjianzhang.html
40江西農業工程職業學院http://www.jxaevc.com
41江西科技職業學院http://www.jxkeda.com/
42江西航空職業技術學院http://www.jhxy.com.cn/?a=web.articles&uid=9059&id=3864
43贛西科技職業學院www.ganxidx.com
44江西制造職業技術學院http://www.jxmtc.com/
45江西工程職業學院http://www.jxrtvu.com/gczyxy/2020/0216/c185a19015/page.html
46江西泰豪動漫職業學院https://www.thdm.edu.cn/
47江西楓林涉外經貿職業學院http://www.fenglin.org
48江西傳媒職業學院http://zsc.jxmvc.cn/
49江西冶金職業技術學院http://zs.jxyjxy.com/
50江西新能源科技職業學院http://www.tynxy.com/
51江西工商職業技術學院http://www.jxgsxy.net/Item/list.asp?id=351
52景德鎮陶瓷職業技術學院http://www.jcivt.com/zsc/index.asp
53共青科技職業學院www.gqkj.com.cn
54江西水利職業學院https://mp.weixin.qq.com/s/FdP8ZOaXkwu3F0ry5mZLgg
55吉安職業技術學院http://www.japt.com.cn/zsxxw/info/1078/1262.htm
56江西洪州職業學院www.jxhzxy.com
57南昌影視傳播職業學院http://www.ncyscb.com/
58贛南衛生健康職業學院http://zsjy.gnhvc.cn/zs.asp
59萍鄉衛生職業學院http://www.pxhvc.com/
60江西婺源茶業職業學院http://jxtvc.com/Item/list.asp?id=1770
61江西經濟管理干部學院http://zsb.jiea.cn/
62贛州職業技術學院http://www.gzpt.edu.cn/
*請認真填寫需求信息,我們會在24小時內與您取得聯系。