excel數(shù)據(jù)導(dǎo)出_第1頁
excel數(shù)據(jù)導(dǎo)出_第2頁
excel數(shù)據(jù)導(dǎo)出_第3頁
excel數(shù)據(jù)導(dǎo)出_第4頁
excel數(shù)據(jù)導(dǎo)出_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、I.Apache POI 簡介 Apache POI是Apache軟件基金會(huì)的開放源碼函式庫,POI提供API給Java程式 對Microsoft Office格式檔案讀和寫的功能。.NET的開發(fā)人員則可以利用NPOI (POI for .NET) 來存取POI的功能。 2.POI結(jié)構(gòu) HSSF XSSF HWPF HSLF HDGF HPBF HSMF 提供讀寫 提供讀寫 提供讀寫 提供讀寫 Microsoft Excel XLS格式檔案的功能。 Microsoft Excel OOXML XLSX 格式檔案的功能。 Microsoft Word DOC 格式檔案的功能。 Microsoft

2、 Po werPoi nt格式檔案的功能。 格式檔案的功能。 格式檔案的功能。 提供讀 Microsoft Visio 提供讀 Microsoft Publisher 提供讀Microsoft Outlook格式檔案的功能。 參考實(shí)例 在web開發(fā)中,有一個(gè)經(jīng)典的功能,就是數(shù)據(jù)的導(dǎo)入導(dǎo)出。特別是數(shù)據(jù)的導(dǎo)出, 在生產(chǎn)管理或者財(cái)務(wù)系統(tǒng)中用的非常普遍,因?yàn)檫@些系統(tǒng)經(jīng)常要做一些報(bào)表打印 的工作。而數(shù)據(jù)導(dǎo)出的格式一般是 EXCEL或者PDF 首先我們來導(dǎo)出EXCEl格式的文件吧?,F(xiàn)在主流的操作Excel文件的開源工具有 很多,用得比較多的就是 Apache的POI及JExcelAPI。這里我們用Apac

3、he POI ! 我們先去Apache的大本營下載POI的jar包:/或者從 我附件下載 Java 代碼 DC 1. 2. 3. 4. 5. 6. 7. 8. 9. p ackage org.le no .ex port.util; import java.util.Date; p ublic class Stude nt p rivate long id; p rivate String n ame; p rivate int age; p rivate boolea n sex; 10. p rivate Date birthday; 11. 11.

4、 public Stude nt() 12. su per(); 13. / TODO Auto-ge nerated con structor stub 14. 16. 17. p ublic Stude nt(l ong id, String n ame, int age, boolea n sex. Date birthday) 18. su per(); 19. this.id = id; 20. this .n ame = n ame; 21. this.age = age; 22. this.sex = sex; 23. this.birthday = birthday; 24.

5、25. 25. p ublic long getId() 26. return id; 27. 29. 28. p ublic void setId(l ong id) 29. this.id = id; 30. 33. 31. public Stri ng getName() 32. return n ame; 33. 37. 34. p ublic void setName(Stri ng n ame) 35. this .n ame = n ame; 36. 41. 37. public in t getAge() 38. retur n age; 39. 45. 40. p ublic

6、 void setAge(i nt age) 41. this.age = age; 42. 49. 43. p ublic boolea n getSex() 44. retur n sex; 45. 53. 46. p ublic void setSex(boolea n sex) 47. this.sex = sex; 48. 57. 49. public Date getBirthday() 50. return birthday; 51. 61. 62. public void setBirthday(Date birthday) 63. this.birthday = birthd

7、ay; 64. 65. 65. Java代碼匚hrC? 1. 2. 3. 4. 5. 6. 7. 8. 9. p ackage org.le no .ex port.util; p ublic class Book p rivate int bookId; p rivate String n ame; p rivate String author; p rivate float p rice; p rivate String isb n; p rivate String p ubName; 10. p rivate byte p reface; 11. 11. public Book() 12

8、. su per(); 13. 15. 14. p ublic Book(i nt bookId, String n ame, String author, float p rice, 17.Stri ng isb n, String p ubName, byte p reface) 18. su per(); 19. this.bookld = bookId; 20. this .n ame = n ame; 21. this.author = author; 22. this .p rice = p rice; 23. this.isb n = isb n; 24. this .p ubN

9、ame = p ubName; 25. this. preface = p reface; 26. 26. 28. 27. public in t getBookId() 28. return bookId; 29. 32. 30. public void setBookld( int bookId) 31. this.bookld = bookId; 32. 36. 33. public Stri ng getName() 34. return n ame; 35. 40. 36. public void setName(Stri ng n ame) 37. this .n ame = n

10、ame; 38. 44. 39. public Stri ng getAuthor() 40. return author; 41. 48. 42. public void setAuthor(Stri ng author) 43. this.author = author; 44. 52. 45. public float get Price() 46. return p rice; 47. 56. 48. p ublic void set Pricefloat p rice) 49. this .p rice = p rice; 50. 60. 51. public Stri ng get

11、Isb n() 52. return isb n; 53. 64. 54. p ublic void setIsb n( Stri ng isb n) 55. this.isb n = isb n; 56. 68. 57. public Stri ng get PubName() 58. return p ubName; 59. 72. 60. public void set PubName(Stri ng pubName) 61. this .p ubName = p ubName; 62. 76. 63. public byte get Preface() 64. return p ref

12、ace; 65. 80. 66. public void set Preface(byte p reface) 67. this .p reface = p reface; 68. 84. 69. 上面這兩個(gè)類一目了然,就是兩個(gè)簡單的javabean風(fēng)格的類。再看下面真正的 重點(diǎn)類: Java代碼令C 1. 2. 3. 4. 5. 6. 7. 8. 9. P ackage org.le no .ex port.util; import java.io.*; import java.la ng.reflect.*; import java.util.*; import java.util.reg

13、ex.Matcher; import java.util.regex. Pattern; import java.text.Si mpl eDateFormat; import javax.swi ng.JO ptio nPane; import org.a pache .p oi.hssf.usermodel.*; 10.i mport org.a pache .p oi.hssf.util.HSSFColor; 11. 12./* 13. *利用開源組件POI3.O.2動(dòng)態(tài)導(dǎo)出EXCEL文檔 轉(zhuǎn)載時(shí)請保留以下信息, 注明出處! 14. * 15. * author leno 16. * v

14、ersio n v1.0 17. * p aram 18. *應(yīng)用泛型,代表任意一個(gè)符合javabean風(fēng)格的類 19. *注意這里為了簡單起見,boolean型的屬性xxx的get器方式為 getXxx(),而不是 isXxx() 20. * byte表jpg格式的圖片數(shù)據(jù) 21. */ 22. p ublic class Exp ortExcelvT 23. 23. public void exportExcel(CollectionvTdataset, OutputStream out) 24. exportExcel(測試 POI 導(dǎo)出 EXCE文檔,null, dataset, ou

15、t, yyyy-MM-dd); 25. 27. 26. p ublic void exp ortExcel(Stri ng headers, Collect ionvT dataset, 29.Out putStream out) 30. exportExcel(測試 POI 導(dǎo)出 EXCE文檔, headers, dataset, out, yyyy-MM-dd); 31. 32. 32. p ublic void exp ortExcel(Stri ng headers, Collect ionvT dataset, 34.Out putStream out, Stri ng p atte

16、rn) 35. exportExcel(測試 POI 導(dǎo)出 EXCE文檔, headers, dataset, out, p attern); 36. 37. 37. /* 38. *這是一個(gè)通用的方法,利用了 JAVA的反射機(jī)制,可以將放置在 JAVA 集合中并且符號一定條件的數(shù)據(jù)以EXCEL的形式輸出到指定IO設(shè)備上 39. * 40. * p aram title 41. *表格標(biāo)題名 42. * p aram headers 43. *表格屬性列名數(shù)組 44. * p aram dataset 45. *需要顯示的數(shù)據(jù)集合,集合中一定要放置符合javabean風(fēng)格的類的 對象。此方法支

17、持的 46. * javabean屬性的數(shù)據(jù)類型有基本數(shù)據(jù)類型及String,Date,byte(圖 片數(shù)據(jù)) 47. * p aram out 48. *與輸出設(shè)備關(guān)聯(lián)的流對象,可以將EXCEL文檔導(dǎo)出到本地文件或者網(wǎng) 絡(luò)中 49. * p aram p atter n 50. *如果有時(shí)間數(shù)據(jù),設(shè)定輸出格式。默認(rèn)為yyy-MM-dd 51. */ 52. S upp ressWar nin gs( un checked) 53. p ublic void exp ortExcel(Stri ng title, Strin g headers, 54. Collect ionvT datas

18、et, Out putStream out, Stri ng p atter n) 55. / 聲明一個(gè)工作薄 56. HSSFWorkbook workbook = new HSSFWorkbook(); 57. / 生成一個(gè)表格 58. HSSFSheet sheet = workbook.createSheet(title); 59. /設(shè)置表格默認(rèn)列寬度為15個(gè)字節(jié) 60. sheet.setDefaultColum nWidth(15); 61. / 生成一個(gè)樣式 62. HSSFCellStyle style = workbook.createCellStyle(); 63. /設(shè)

19、置這些樣式 64. style.setFillForegro un dColor(HSSFColor.SKY_BLUE.i ndex); 65. style.setFill Pattem(HSSFCellStyle.SOLID_FOREGROUND); 66. style.setBorderBottom(HSSFCellStyle.BORDER_THIN); 67. style.setBorderLeft(HSSFCellStyle.BORDER_THIN); 68. style.setBorderRight(HSSFCellStyle.BORDER_THIN); 69. style.setB

20、orderTo p(HSSFCellStyle.BORDER_THIN); 70. style.setAlig nmen t(HSSFCellStyle.ALIGN_CENTER); 71. / 生成一個(gè)字體 72. HSSF Font fon t = workbook.createFo nt(); 73. fo nt.setColor(HSSFColor.VIOLET.i ndex); 74. fo nt.setFo ntHeightI nP oi nts(short) 12); 75. fo nt.setBoldweight(HSSFFo nt.BOLDWEIGHT_BOLD); 76.

21、/把字體應(yīng)用到當(dāng)前的樣式 77. style.setFo nt(fo nt); 78. /生成并設(shè)置另一個(gè)樣式 79. HSSFCellStyle style2 = workbook.createCellStyle(); 80. style2.setFillForegro un dColor(HSSFColor.LIGHT_YELLOW.i ndex); 81. style2.setFill Pattem(HSSFCellStyle.SOLID_FOREGROUND); 82. style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); 83. sty

22、le2.setBorderLeft(HSSFCellStyle.BORDER_THIN); 84. style2.setBorderRight(HSSFCellStyle.BORDER_THIN); 85. style2.setBorderTo p(HSSFCellStyle.BORDER_THIN); 86. style2.setAlig nmen t(HSSFCellStyle.ALIGN_CENTER); 87. style2.setVerticalAlig nmen t(HSSFCellStyle.VERTICAL_CENTER); 88. / 生成另一個(gè)字體 89. HSSFFo n

23、t font2 = workbook.createFo nt(); 90. fo nt2.setBoldweight(HSSFFo nt.BOLDWEIGHT_NORMAL); 91. /把字體應(yīng)用到當(dāng)前的樣式 92. style2.setFo nt(fo nt2); 94. 93. /聲明一個(gè)畫圖的頂級管理器 94. HSS FP atriarch p atriarch = sheet.createDrawi ngP atriarch(); 95. /定義注釋的大小和位置,詳見文檔 96. HSSFComme nt comme nt = p atriarch.createComme nt(n

24、ew HSSFClie ntAn chor(0, 99.0, 0, 0, (short) 4, 2, (short) 6, 5); 100. /設(shè)置注釋內(nèi)容 101. comment.setString(new HSSFRichTextString(可以在 POI 中添加 注釋!); 102./設(shè)置注釋作者,當(dāng)鼠標(biāo)移動(dòng)到單元格上是可以在狀態(tài)欄中看到該 內(nèi)容. comme nt.setAuthor(le no); 103. 104. 105. 106. 107. 108. 109. 110. /產(chǎn)生表格標(biāo)題行 HSSFRow row = sheet.createRow(O); for (int

25、i = 0; i headers.le ngth; i+) HSSFCell cell = row.createCell(i); cell.setCellStyle(style); HSSFRichTextStri ng text = new HSSFRichTextStri ng(headersi); cell.setCellValue(text); 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. /遍歷集合數(shù)據(jù),產(chǎn)生數(shù)據(jù)行 Iterator it = dataset.iterator(); int in dex = 0; whi

26、le (it.hasNextO) in dex+; row = sheet.createRow(i ndex); T t = (T) it. next(); /利用反射,根據(jù)javabean屬性的先后順序,動(dòng)態(tài)調(diào)用getXxx() 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 方法得到屬性值 Field fields = t.getClass().getDeclaredFields(); for (i nt i = 0; i ex

27、= new Exp ortExcelvStude nt(); 231. String headers = 學(xué)號,姓名,年齡,性別,出生 日期; 232. ListvStude nt dataset = new ArrayListvStude nt(); 233. dataset.add( new Stude nt(10000001, Date(); 234. dataset.add( new Stude nt(20000002, Date(); 235. dataset.add( new Stude nt(30000003, Date(); 236. /測試圖書 237. Exp ortExc

28、elvBook ex2 = new Exp ortExcelvBook(); 238. String headers2 = 圖書編號,圖書名稱,圖書作者, 圖書價(jià)格,圖書ISBN, 圖書出版社,封面圖片; ListvBook dataset2 = new ArrayListvBook(); try Bufferedl np utStream bis = new Bufferedl np utStream( new Filel np utStream(book.j pg); byte buf = new bytebis.available(); while (bis.read(buf) != -

29、1) / dataset2.add( new Book(1, js p, le no, 300.33f, 1234567, 清華出版社, buf); dataset2.add( new Book(2, java 張三,20, true, new 李四,24, false, new 王五,22, true, new 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 編程思想,bruci, 300.33f, 1234567, 251. 陽光出版社, buf); 252. dataset2.add( new Book(3, DOM

30、 1234567, 253. 清華出版社, buf); 254. dataset2.add( new Book(4, c+ 1234567, 255. 清華出版社, buf); 256. dataset2.add( new Book(5, c# 1234567, 湯春秀出版社, buf); 藝術(shù),le nota ng, 300.33f, 經(jīng)典, le no, 400.33f, 入門,le no, 300.33f, 257. 258. 259. 260. 261. 262. 263. 264. Out putStream out = new FileOut putStream(D:/a.xls)

31、; Out pu tStream out2 = new FileOut pu tStream(D:/b.xls); ex.ex portExcel(headers, dataset, out); ex2.ex portExcel(headers2, dataset2, out2); out.close(); JOptionPane.showMessageDialog(null,導(dǎo)出成功!); 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. System.out .printin (excel 導(dǎo)出成功!); catch (FileN

32、otF oun dExce pti on e) / TODO Auto-ge nerated catch block e.prin tStackTrace(); catch (lOExce pti on e) / TODO Auto-ge nerated catch block e.prin tStackTrace(); 不行,頭有點(diǎn)暈。呵呵,又是泛型,又是反射,又是正則表達(dá)式,又是重載: 還有多參數(shù)列表和POI API。一下子蹦出來,實(shí)在讓人吃不消。不管了,頂住看 效果先。在本地運(yùn)行后,我們發(fā)現(xiàn)在 E:/下生成了兩份excel文件:學(xué)生記錄 和圖書記錄,并且中文,數(shù)字,顏色,日期,圖片等等一

33、且正常。恩,太棒了。 有人看到這里開始苦臉了:喂,我怎么一運(yùn)行就報(bào)錯(cuò)啊!呵呵,看看什么錯(cuò)吧! 哦,找不到文件,也就是說你沒有 book.jpg嘛。好,拷貝一張小巧的圖書圖片 命名為book.jpg放置到當(dāng)前工程下吧。注意,您千萬別把張桌面大小的圖片丟 進(jìn)去了 !看到效果了吧?,F(xiàn)在我們再來簡單梳理一下代碼,實(shí)際上上面就做 了一個(gè)導(dǎo)出excel的方法和一個(gè)本地測試main()方法。并且代碼的結(jié)構(gòu)也很清 晰,只是涉及的知識點(diǎn)稍微多一點(diǎn)。大家細(xì)心看看注釋,結(jié)合要完成的功能,應(yīng) 該沒有太大問題的。好啦,吃杯茶,擦把汗,總算把這個(gè)類消化掉,你又進(jìn)步了。 咦,你不是說是在 WE酥境下導(dǎo)出的嗎?別急,因?yàn)閷?dǎo)出

34、就是一個(gè)下載的過程。 我們只需要在服務(wù)器端寫一個(gè)Jsp或者Servlet組件完成輸出excel到瀏覽器客 戶端的工作就好了。我們以Servlet為例,還是看代碼吧: P ackage org.le no .ex port.util; 1. 2. import java.io.*; import java.util.ArrayList; import java.util.List; 3. 4. 5. import javax.servlet.ServletExce pti on; import javax.servlet.htt p.Htt pServletRequest; import jav

35、ax.servlet.htt p. Htt pServletRes ponse; 6. 7. 8. 9. 10. 11./* 12.* author leno 使用servlet 導(dǎo)出動(dòng)態(tài)生成的excel文件,數(shù)據(jù)可以來 源于數(shù)據(jù)庫 13. *這樣,瀏覽器客戶端就可以訪問該 servlet得到一份用java代碼動(dòng)態(tài) 生成的excel文件 14. */ 15. p ublic class Export exte nds javax.servlet.htt p. Htt pServlet 16. static fin al lo ng serialVersio nUID = 1L; 17. 17.

36、 protected void doGet(Htt pServletRequest request, 18. Htt pServletRes ponse res pon se) throws ServletExce pti on, IOExce ptio n 19. File file = new File(getServletCo ntext() 21.getReal Path(WEB-INF/book.j pg); 22. res pon se.setCo ntentTyp e(octets/stream); 23. res pon se.addHeader(C onten t-Dis p

37、o siti on, 24. attachme nt;file name=test.xls); 25. /測試圖書 26. Ex portExcelvBook ex = new Exp ortExcelvBook(); 27.String headers = 圖書編號,圖書名稱,圖書作者,圖書價(jià) 格,圖書ISBN,圖書出版社, 28. 封面圖片; 29. List dataset = new ArrayList(); 30. try 31. BufferedI np utStream bis = new BufferedI np utStream( 32. new File Inp utStr

38、eam(file); 33. byte buf = new bytebis.available(); 34. while (bis.read(buf) != -1) 35. /將圖片數(shù)據(jù)存放到緩沖數(shù)組中 36. 37. dataset.add( new Book(1, js p, le no, 300.33f, 1234567, 出版社, 38. buf); 39. dataset.add( new Book(2, java 1234567, 40. 陽光出版社, buf); 41. dataset.add( new Book(3, DOM 1234567, 42. 清華出版社, buf);

39、43. dataset.add( new Book(4, c+ 44. 清華出版社, buf); 45. dataset.add( new Book(5, c# 46. 湯春秀出版社, buf); 編程思想, brucl, 300.33f, 藝術(shù),le no ta ng, 300.33f, 經(jīng)典, le no, 400.33f, 1234567, 入門,le no, 300.33f, 1234567, 47.Out putStream out = respon se.getOut putStream(); 48.ex.ex portExcel(headers, dataset, out); 4

40、9.out.close(); 50.System.out. prin tl n(excel 導(dǎo)出成功?。?; 清華 51. catch (FileNotFou ndExce ption e) 52. / TODO Auto-ge nerated catch block 53. e .prin tStackTrace(); 54. catch (IOExce ption e) 55. / TODO Auto-ge nerated catch block 56. e. prin tStackTrace(); 57. 58. 59. 59. protected void doPo st(Htt pSe

41、rvletRequest request, 60. Htt pServletRes ponse res pon se) throws ServletExce pti on, IOExce ptio n 61. doGet(request, res pon se); 62. 63. 寫完之后,如果您不是用 eclipse工具生成的Servlet,千萬別忘了在web.xml 上注冊這個(gè)Servelt。我用的是Ecl ip se工具生成的servlet,自動(dòng)注冊了 servlet,注冊內(nèi)容如下: Ex portv/servlet -n ame org.le no .ex port.util.Ex portv/servlet-class Ex portv/servlet -n ame /servlet/Ex portv/u

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論