2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  POI操作Excel----------(轉(zhuǎn)載)</p><p>  java當(dāng)初把核心處理設(shè)成Unicode,帶來(lái)的好處是另代碼適應(yīng)了多語(yǔ)言環(huán)境。然而由于老外的英語(yǔ)只有26個(gè)字母,有些情況下,一些程序員用8 位的byte處理,一不小心就去掉了CJK的高位?;蛘呤怯捎诹?xí)慣在程序中采用硬編碼,還有多種原因,使得許多java應(yīng)用在CJK的處理上很煩惱。期貨開(kāi)戶(hù)流程還好 在POI HSSF中考慮到

2、這個(gè)問(wèn)題,可以設(shè)置encoding為雙字節(jié)。POI可以到www.apache.org下載到。編譯好的jar主要有這樣4個(gè):poi包,poi Browser包,poi hdf包,poi hssf例程包。實(shí)際運(yùn)行時(shí),需要有poi包就可以了。如果用Jakarta ant編譯和運(yùn)行,下載apache Jakarta POI的release中的src包,它里面已經(jīng)為你生成好了build文件了。只要運(yùn)行ant就可以了(ant 的安裝和使用在此不

3、說(shuō)了)。如果是用Jbuilder 運(yùn)行,請(qǐng)?jiān)谛陆ǖ捻?xiàng)目中加入poi包。以Jbuilder6為例,選擇Tools菜單項(xiàng)的config libraries...選項(xiàng),新建一個(gè)lib。在彈出的菜單中選擇poi包,如這個(gè)jakarta-poi-</p><p>  [java] view plaincopyprint?</p><p>  <span style="fon

4、t-family:Microsoft YaHei;font-size:12px;color:#333333;">Java代碼    </p><p>  import org.apache.poi.hssf.usermodel.HSSFWorkbook;    </p><p&g

5、t;  import java.io.FileOutputStream;    </p><p>  import java.io.IOException;    </p><p>  public class NewWorkbook   &

6、#160;</p><p><b>  {    </b></p><p>  public static void main(String[] args)    </p><p>  throws IOExcept

7、ion    </p><p><b>  {    </b></p><p>  HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook對(duì)象     &l

8、t;/p><p>  FileOutputStream fileOut = new FileOutputStream("workbook.xls");    </p><p>  wb.write(fileOut);//把Workbook對(duì)象輸出到文件workbook.xls中 

9、60;   </p><p>  fileOut.close();    </p><p><b>  }    </b></p><p><b>  }    </b></p&

10、gt;<p>  通過(guò)這個(gè)例子,商品期貨開(kāi)戶(hù)我們建立的是一個(gè)空白的xls文件(不是空文件)。在此基礎(chǔ)上,我們可以進(jìn)一步看其它的例子。    </p><p>  import org.apache.poi.hssf.usermodel.*;    </p><p>  import

11、60;java.io.FileOutputStream;    </p><p>  import java.io.IOException;    </p><p>  public class CreateCells    </p&g

12、t;<p><b>  {    </b></p><p>  public static void main(String[] args)    </p><p>  throws IOException 

13、0;  </p><p><b>  {    </b></p><p>  HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook對(duì)象     </p><

14、;p>  HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet對(duì)象     </p><p>  // Create a row and put some cells 

15、in it. Rows are 0 based.     </p><p>  HSSFRow row = sheet.createRow((short)0);//建立新行     </p><p>  // Create

16、 a cell and put a value in it.     </p><p>  HSSFCell cell = row.createCell((short)0);//建立新cell     </p>

17、<p>  cell.setCellValue(1);//設(shè)置cell的整數(shù)類(lèi)型的值     </p><p>  // Or do it on one line.     </p><p>  row.createCell((short)1

18、).setCellValue(1.2);//設(shè)置cell浮點(diǎn)類(lèi)型的值     </p><p>  row.createCell((short)2).setCellValue("test");//設(shè)置cell字符類(lèi)型的值     </p><p>  row.createCell((shor

19、t)3).setCellValue(true);//設(shè)置cell布爾類(lèi)型的值     </p><p>  HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell樣式     </p><p>  cellStyle.se

20、tDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));//設(shè)置cell樣式為定制的日期格式     </p><p>  HSSFCell dCell =row.createCell((short)4);    </p>

21、<p>  dCell.setCellValue(new Date());//設(shè)置cell為日期類(lèi)型的值     </p><p>  dCell.setCellStyle(cellStyle); //設(shè)置該cell日期的顯示格式     </p><p>  HSSFCell&

22、#160;csCell =row.createCell((short)5);    </p><p>  csCell.setEncoding(HSSFCell.ENCODING_UTF_16);//設(shè)置cell編碼解決中文高位字節(jié)截?cái)?#160;    </p><p>  csCell.setCellVal

23、ue("中文測(cè)試_Chinese Words Test");//設(shè)置中西文結(jié)合字符串     </p><p>  row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);//建立錯(cuò)誤cell     </p>

24、<p>  // Write the output to a file     </p><p>  FileOutputStream fileOut = new FileOutputStream("workbook.xls"); &#

25、160;  </p><p>  wb.write(fileOut);    </p><p>  fileOut.close();    </p><p><b>  }    </b></p>

26、;<p><b>  }    </b></p><p>  我稍微修改了原來(lái)的examples包中的CreateCells類(lèi)寫(xiě)了上面的功能測(cè)試類(lèi)。通過(guò)這個(gè)例子,我們可以清楚的看到xls文件從大到小包 括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell這樣幾個(gè)對(duì)象。我

27、們可以在cell中設(shè)置各種類(lèi)型的值。尤其要注意的是如果你想正確的顯示非歐美的字符時(shí),尤其象中日韓這樣的語(yǔ)言,必須 股指期貨開(kāi)戶(hù)設(shè)置編碼為16位的即是HSSFCell.ENCODING_UTF_16,才能保證字符的高8位不被截?cái)喽鹁幋a失真形成亂碼。    </p><p>  其他測(cè)試可以通過(guò)參考examples包中的測(cè)試?yán)诱莆誴oi的詳細(xì)用法,包括字體的設(shè)置

28、,cell大小和低紋的設(shè)置等。需要注意的是POI是一 個(gè)仍然在完善中的公開(kāi)代碼的項(xiàng)目,所以有些功能正在不斷的擴(kuò)充。如HSSFSheet的getFooter() getHeader()和setFooter(HSSFFooter hsf) setHeader(HSSFHeader hsh)是在POI1.7中才有的,而POI1.5中就沒(méi)有。運(yùn)行測(cè)試熟悉代碼或者使用它做項(xiàng)目時(shí)請(qǐng)注意POI的版本。

29、    </p><p>  另外需要注意的是HSSF也有它的對(duì)xls基于事件的解析??梢詤⒖祭讨械腅ventExample.java。它通過(guò)實(shí)現(xiàn) HSSFListener完成從普通流認(rèn)知Xls中包含的內(nèi)容,在apache Cocoon中的org.apache.cocoon.serialization.HSSFSerializer中用到了這個(gè)解析。因?yàn)?/p>

30、Cocoon2 是基于事件的,所以POI為了提供快速的解析也提供了相應(yīng)的事件。當(dāng)然我們自己也可以實(shí)現(xiàn)這個(gè)事件接口。    </p><p>  因?yàn)镻OI還不是一個(gè)足夠成熟的項(xiàng)目,所以有必要做進(jìn)一步的開(kāi)發(fā)和測(cè)試。但是它已經(jīng)為我們用純java操作ole2對(duì)象提供了可能,而且克服了ole對(duì)象調(diào)用的缺陷,提供了服務(wù)器端的Excel解決方案。  

31、60;  </p><p>  ======================================================    </p><p>  利用Java 創(chuàng)建和讀取Excel文檔    </p><p>  為了保證示例程序的運(yùn)

32、行,必須安裝Java 2 sdk1.4.0 和Jakarta POI,Jakarta POI的Web站點(diǎn)是: http://jakarta.apache.org/poi/     </p><p>  示例1將演示如何利用Jakarta POI API 創(chuàng)建Excel 文檔。

33、    </p><p>  示例1程序如下:    </p><p>  import org.apache.poi.hssf.usermodel.HSSFWorkbook;    </p><p>  import org.

34、apache.poi.hssf.usermodel.HSSFSheet;    </p><p>  import org.apache.poi.hssf.usermodel.HSSFRow;    </p><p>  import org.apache.poi.hssf.usermode

35、l.HSSFCell;    </p><p>  import java.io.FileOutputStream;    </p><p>  public class CreateXL {    </p><

36、p>  /** Excel 文件要存放的位置,假定在D盤(pán)JTest目錄下*/    </p><p>  public static String outputFile="D:/JTest/ gongye.xls";    </p>&

37、lt;p>  public static void main(String argv[])    </p><p><b>  {    </b></p><p><b>  try    &l

38、t;/b></p><p><b>  {    </b></p><p>  // 創(chuàng)建新的Excel 工作簿     </p><p>  HSSFWorkbook workbook = new 

39、HSSFWorkbook();    </p><p>  // 在Excel工作簿中建一工作表,其名為缺省值     </p><p>  // 如要新建一名為"效益指標(biāo)"的工作表,其語(yǔ)句為:     </p>&l

40、t;p>  // HSSFSheet sheet = workbook.createSheet("效益指標(biāo)");     </p><p>  HSSFSheet sheet = workbook.createSheet();    <

41、;/p><p>  // 在索引0的位置創(chuàng)建行(最頂端的行)     </p><p>  HSSFRow row = sheet.createRow((short)0);    </p><p>  //在索引0的位置創(chuàng)建單元格(左上端) 

42、    </p><p>  HSSFCell cell = row.createCell((short) 0);    </p><p>  // 定義單元格為字符串類(lèi)型     </p><p>  ce

43、ll.setCellType(HSSFCell.CELL_TYPE_STRING);    </p><p>  // 在單元格中輸入一些內(nèi)容     </p><p>  cell.setCellValue("增加值");    </

44、p><p>  // 新建一輸出文件流     </p><p>  FileOutputStream fOut = new FileOutputStream(outputFile);    </p><p>  // 把相應(yīng)的Ex

45、cel 工作簿存盤(pán)     </p><p>  workbook.write(fOut);    </p><p>  fOut.flush();    </p><p>  // 操作結(jié)束,關(guān)閉文件  

46、  </p><p>  fOut.close();    </p><p>  System.out.println("文件生成...");    </p><p>  }catch(Exception e) { &

47、#160;  </p><p>  System.out.println("已運(yùn)行 xlCreate() : " + e );    </p><p><b>  }    </b><

48、/p><p><b>  }    </b></p><p><b>  }    </b></p><p>  讀取Excel文檔中的數(shù)據(jù)    </p><p>  示例2將演示如

49、何讀取Excel文檔中的數(shù)據(jù)。假定在D盤(pán)JTest目錄下有一個(gè)文件名為gongye.xls的Excel文件。    </p><p>  示例2程序如下:    </p><p>  import org.apache.poi.hssf.usermodel.HSSFWorkbook; 

50、60;  </p><p>  import org.apache.poi.hssf.usermodel.HSSFSheet;    </p><p>  import org.apache.poi.hssf.usermodel.HSSFRow;    </p>

51、;<p>  import org.apache.poi.hssf.usermodel.HSSFCell;    </p><p>  import java.io.FileInputStream;    </p><p>  public class Re

52、adXL {    </p><p>  /** Excel文件的存放位置。注意是正斜線(xiàn)*/    </p><p>  public static String fileToBeRead="D:/JTest/ gongye.xls"

53、;;    </p><p>  public static void main(String argv[]){     </p><p><b>  try{    </b></p>

54、<p>  // 創(chuàng)建對(duì)Excel工作簿文件的引用     </p><p>  HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));    </p>

55、<p>  // 創(chuàng)建對(duì)工作表的引用。     </p><p>  // 本例是按名引用(讓我們假定那張表有著缺省名"Sheet1")     </p><p>  HSSFSheet sheet = workbook.getSh

56、eet("Sheet1");    </p><p>  // 也可用getSheetAt(int index)按索引引用,     </p><p>  // 在Excel文檔中,第一張工作表的缺省索引是0,     &

57、lt;/p><p>  // 其語(yǔ)句為:HSSFSheet sheet = workbook.getSheetAt(0);     </p><p>  // 讀取左上端單元     </p><p>  HSSFRow row&#

58、160;= sheet.getRow(0);    </p><p>  HSSFCell cell = row.getCell((short)0);    </p><p>  // 輸出單元內(nèi)容,cell.getStringCellValue()就是取所在單

59、元的值     </p><p>  System.out.println("左上端單元是: " + cell.getStringCellValue());     </p><p>  }catch(Exception e) {&

60、#160;   </p><p>  System.out.println("已運(yùn)行xlRead() : " + e );    </p><p><b>  }    </b></p

61、><p><b>  }    </b></p><p><b>  }    </b></p><p>  設(shè)置單元格格式    </p><p>  在這里,我們將只介紹一些和格式

62、設(shè)置有關(guān)的語(yǔ)句,我們假定workbook就是對(duì)一個(gè)工作簿的引用。在Java    </p><p>  中,第一步要做的就是創(chuàng)建和設(shè)置字體和單元格的格式,然后再應(yīng)用這些格式:    </p><p>  1、創(chuàng)建字體,設(shè)置其為紅色、粗體:    </p>&

63、lt;p>  HSSFFont font = workbook.createFont();    </p><p>  font.setColor(HSSFFont.COLOR_RED);    </p><p>  font.setBoldweight(HSSFFont.B

64、OLDWEIGHT_BOLD);    </p><p>  2、創(chuàng)建格式    </p><p>  HSSFCellStyle cellStyle= workbook.createCellStyle();    </p><p&

65、gt;  cellStyle.setFont(font);    </p><p>  3、應(yīng)用格式     </p><p>  HSSFCell cell = row.createCell((short) 0);    

66、;</p><p>  cell.setCellStyle(cellStyle);    </p><p>  cell.setCellType(HSSFCell.CELL_TYPE_STRING);    </p><p>  cell.setCellValue("標(biāo)題

67、60;");    </p><p>  總之,如本篇文章所演示的一樣,Java程序員不必?fù)?dān)心Excel工作表中的數(shù)據(jù)了,利用Jakarta POI API,    </p><p>  我們就可以輕易的在程序中存取Excel文檔。    &

68、lt;/p><p>  ==============================================    </p><p>  首先說(shuō)說(shuō)現(xiàn)在我所知道的Java編輯Excel文件的兩大開(kāi)源工具:    </p><p>  jakarta POI和JavaExcel

69、API(簡(jiǎn)稱(chēng)JXL),這兩套工具我都試用了一這段時(shí)間,感覺(jué)各有優(yōu)劣吧。POI在某些細(xì)節(jié)有些小Bug并且不支持寫(xiě)入圖片,其他方面都挺不錯(cuò)的;    </p><p>  JXL就慘了,除了支持寫(xiě)入圖片外,我暫時(shí)看不到它比POI好的地方,我碰到的主要的問(wèn)題就是對(duì)公式支持不是很好,很多帶有公式的Excel文件用 JXL打開(kāi)后,公式就丟失了(比如now(),today()

70、),在網(wǎng)上看到其他大蝦評(píng)論說(shuō)JXL寫(xiě)入公式也有問(wèn)題,另外,JXL操作Excel文件的效 率比POI低一點(diǎn)。經(jīng)過(guò)比較后,我選擇了POI開(kāi)發(fā)我的項(xiàng)目。    </p><p>  現(xiàn)在我要做的東西基本完成啦,我把這段時(shí)間使用POI的一些心得總結(jié)出來(lái),希望能對(duì)和我遇到相同問(wèn)題的朋友有所幫助,至于POI基本的使用方法,自己去看文檔吧。   &

71、#160;</p><p>  1、設(shè)置分頁(yè)符的bug    </p><p>  POI里的HSSFSheet類(lèi)提供了setRowBreak方法可以設(shè)置Sheet的分頁(yè)符。    </p><p>  Bug:如果你要設(shè)置分頁(yè)符的Sheet是本來(lái)就有的,并且你沒(méi)有在里面插入過(guò)分頁(yè)符,那

72、么調(diào)用setRowBreak時(shí)POI會(huì)拋出空指針的異常。    </p><p>  解決方法:在Excel里給這個(gè)sheet插入一個(gè)分頁(yè)符,用POI打開(kāi)后再把它刪掉,然后你就可以隨意插入分頁(yè)符了。    </p><p>  如果sheet是由POI生成的則沒(méi)有這個(gè)問(wèn)題。我跟蹤了setRowBreak的源代碼

73、,發(fā)現(xiàn)是Sheet.Java下的 PageBreakRecord rowBreaks這個(gè)變量在搞鬼,如果Sheet里原來(lái)沒(méi)有分頁(yè)符,開(kāi)發(fā)這個(gè)模塊的那位兄臺(tái)忘了為這個(gè)對(duì)象new實(shí)例,所以只能我們先手工給Excel 插入一個(gè)分頁(yè)符來(lái)觸發(fā)POI為rowBreaks創(chuàng)建實(shí)例。    </p><p>  2、如何拷貝行   

74、; </p><p>  我在gmane.org的POI用戶(hù)論壇翻遍了每個(gè)相關(guān)的帖子,找遍了api,也沒(méi)看到一個(gè)拷貝行的方法,沒(méi)辦法,只能自己寫(xiě):    </p><p>  //注:this.fWorkbook是一個(gè)HSSHWorkbook,請(qǐng)自行在外部new     </p><

75、;p>  public void copyRows    </p><p>  (String pSourceSheetName,     </p><p>  String pTargetSheetName,    

76、; </p><p>  int pStartRow, int pEndRow,    </p><p>  int pPosition)    </p><p><b>  {    &

77、lt;/b></p><p>  HSSFRow sourceRow = null;    </p><p>  HSSFRow targetRow = null;    </p><p>  HSSFCell 

78、sourceCell = null;    </p><p>  HSSFCell targetCell = null;    </p><p>  HSSFSheet sourceSheet = null;  

79、  </p><p>  HSSFSheet targetSheet = null;    </p><p>  Region region = null;    </p><p>  int cT

80、ype;    </p><p>  int i;    </p><p>  short j;    </p><p>  int targetRowFrom;    <

81、/p><p>  int targetRowTo;    </p><p>  if ((pStartRow == -1) || (pEndRow == -1))    </p><p><b>  {

82、    </b></p><p>  return;    </p><p><b>  }    </b></p><p>  sourceSheet = this.fWorkbook.get

83、Sheet(pSourceSheetName);    </p><p>  targetSheet = this.fWorkbook.getSheet(pTargetSheetName);    </p><p>  //拷貝合并的單元格     &

84、lt;/p><p>  for (i = 0; i < sourceSheet.getNumMergedRegions(); i++)    </p><p><b>  {    </b></p>&l

85、t;p>  region = sourceSheet.getMergedRegionAt(i);    </p><p>  if ((region.getRowFrom() >= pStartRow) && (region.getRowTo() <= 

86、;pEndRow))    </p><p><b>  {    </b></p><p>  targetRowFrom = region.getRowFrom() - pStartRow + pPosition; 

87、   </p><p>  targetRowTo = region.getRowTo() - pStartRow + pPosition;    </p><p>  region.setRowFrom(targetRowFrom);  &

88、#160; </p><p>  region.setRowTo(targetRowTo);    </p><p>  targetSheet.addMergedRegion(region);    </p><p><b>  }   

89、; </b></p><p><b>  }     </b></p><p>  //設(shè)置列寬     </p><p>  for (i = pStartRow; i <=&

90、#160;pEndRow; i++)    </p><p><b>  {    </b></p><p>  sourceRow = sourceSheet.getRow(i);    </p><

91、;p>  if (sourceRow != null)    </p><p><b>  {    </b></p><p>  for (j = sourceRow.getFirstCellNum(); j&#

92、160;< sourceRow.getLastCellNum(); j++)    </p><p><b>  {    </b></p><p>  targetSheet.setColumnWidth(j, sourceSheet.getColum

93、nWidth(j));    </p><p><b>  }    </b></p><p>  break;    </p><p><b>  }    </b&g

94、t;</p><p><b>  }    </b></p><p>  //拷貝行并填充數(shù)據(jù)     </p><p>  for (;i <= pEndRow; i++)    

95、;</p><p><b>  {    </b></p><p>  sourceRow = sourceSheet.getRow(i);    </p><p>  if (sourceRow == null)&

96、#160;   </p><p><b>  {    </b></p><p>  continue;    </p><p><b>  }    </b></p&

97、gt;<p>  targetRow = targetSheet.createRow(i - pStartRow + pPosition);    </p><p>  targetRow.setHeight(sourceRow.getHeight());    

98、;</p><p>  for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)    </p><p><b>  {    <

99、;/b></p><p>  sourceCell = sourceRow.getCell(j);    </p><p>  if (sourceCell == null)    </p><p><b>  {

100、0;   </b></p><p>  continue;    </p><p><b>  }    </b></p><p>  targetCell = targetRow.createCell(

101、j);    </p><p>  targetCell.setEncoding(sourceCell.getEncoding());    </p><p>  targetCell.setCellStyle(sourceCell.getCellStyle());    

102、;</p><p>  cType = sourceCell.getCellType();    </p><p>  targetCell.setCellType(cType);    </p><p>  switch (cType) 

103、0;  </p><p><b>  {    </b></p><p>  case HSSFCell.CELL_TYPE_BOOLEAN:     </p><p>  targetCell.setCellValue(so

104、urceCell.getBooleanCellValue());    </p><p>  break;    </p><p>  case HSSFCell.CELL_TYPE_ERROR:    </p><p>  target

105、Cell.setCellErrorValue(sourceCell.getErrorCellValue());    </p><p>  break;                </p><

106、p>  case HSSFCell.CELL_TYPE_FORMULA:    </p><p>  //parseFormula這個(gè)函數(shù)的用途在后面說(shuō)明     </p><p>  targetCell.setCellFormula(parseFormula(sourceCell.getCe

107、llFormula()));    </p><p>  break;    </p><p>  case HSSFCell.CELL_TYPE_NUMERIC:    </p><p>  targetCell.setCellValu

108、e(sourceCell.getNumericCellValue());    </p><p>  break;    </p><p>  case HSSFCell.CELL_TYPE_STRING:    </p><p>  t

109、argetCell.setCellValue(sourceCell.getStringCellValue());    </p><p>  break;    </p><p><b>  }    </b></p><p>

110、;<b>  }    </b></p><p><b>  }    </b></p><p><b>  }    </b></p><p>  這個(gè)函數(shù)有兩個(gè)問(wèn)題暫時(shí)無(wú)法解決:

111、    </p><p>  a、只能在同一個(gè)Workbook里面使用,跨Workbook總是拷不過(guò)去,不知道為什么?    </p><p>  b、由于在拷貝行時(shí)也把行高也拷過(guò)去了,如果往這些單元格里寫(xiě)入的數(shù)據(jù)長(zhǎng)度超過(guò)單元格長(zhǎng)度,那么他們不會(huì)自動(dòng)調(diào)整行高!    &l

112、t;/p><p>  3、公式的問(wèn)題    </p><p>  POI對(duì)Excel公式的支持是相當(dāng)好的,但是我發(fā)現(xiàn)一個(gè)問(wèn)題,如果公式里面的函數(shù)不帶參數(shù),比如now()或today(),那么你通過(guò) getCellFormula()取出來(lái)的值就是now(ATTR(semiVolatile))和today(ATTR (semiVolati

113、le)),這樣的值寫(xiě)入Excel是會(huì)出錯(cuò)的,這也是我上面copyRow的函數(shù)在寫(xiě)入公式前要調(diào)用parseFormula的原 因,parseFormula這個(gè)函數(shù)的功能很簡(jiǎn)單,就是把ATTR(semiVolatile)刪掉,我把它的代碼貼出來(lái):    </p><p>  private String parseFormula(String

114、60;pPOIFormula)    </p><p><b>  {    </b></p><p>  final String cstReplaceString = "ATTR(semiVolatile)"; //

115、$NON-NLS-1$     </p><p>  StringBuffer result = null;    </p><p>  int index;    </p><p>  result

116、0;= new StringBuffer();    </p><p>  index = pPOIFormula.indexOf(cstReplaceString);    </p><p>  if (index >= 0)

117、0;   </p><p><b>  {    </b></p><p>  result.append(pPOIFormula.substring(0, index));    </p><p>  result.appe

118、nd(pPOIFormula.substring(index + cstReplaceString.length()));    </p><p><b>  }    </b></p><p><b>  else   

119、0;</b></p><p><b>  {    </b></p><p>  result.append(pPOIFormula);    </p><p><b>  }    </b>

120、</p><p>  return result.toString();    </p><p><b>  }    </b></p><p>  至于為什么會(huì)出現(xiàn)ATTR(semiVolatile),還需要大家的探索精神!  

121、60; </p><p>  4、向Excel寫(xiě)入圖片的問(wèn)題。    </p><p>  我上POI論壇查相關(guān)帖子,得到兩種結(jié)論:    </p><p>  1、不支持寫(xiě)入圖片;    </p><p>  2

122、、支持寫(xiě)入圖片,通過(guò)EscherGraphics2d這個(gè)Class實(shí)現(xiàn)。于是我就去查EscherGraphics2d這個(gè)Class,發(fā)現(xiàn) 這個(gè)Class提供了N個(gè)drawImage方法,喜出望外的我開(kāi)始寫(xiě)代碼,結(jié)果調(diào)了一天,一直看不到效果,黔驢技窮的我在萬(wàn)般無(wú)奈下只好跟蹤進(jìn) drawImage這個(gè)函數(shù)內(nèi)部,經(jīng)過(guò)N個(gè)函數(shù)調(diào)用后在最底層函數(shù)發(fā)現(xiàn)了最終答案:    </p>

123、;<p>  public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,    </p><

124、p>  int sx2, int sy2, Color bgColor, ImageObserver imageobserver)    </p><p><b>  {    </b></p><p>  if&

125、#160;(logger.check( POILogger.WARN ))    </p><p>  logger.log(POILogger.WARN,"drawImage() not supported");    </p><p>  retu

126、rn true;    </p><p><b>  }    </b></p><p>  所以我強(qiáng)烈建議大家,以后使用第三方開(kāi)發(fā)包一定盡量下載它的源代碼,這樣你在碰到問(wèn)題時(shí),看看它的的內(nèi)部是怎么實(shí)現(xiàn)的,很多時(shí)候就可以不必重蹈我的 覆轍了。既然POI不能寫(xiě)入圖片,那我

127、們只能把目光投向JXL,我用JXL寫(xiě)入圖片功能是實(shí)現(xiàn)了,付出的代價(jià)是now()和today()這些函數(shù)丟失掉 了,魚(yú)與熊掌不能兼得吧。    </p><p>  ==========================jsp操作===============================    </p><

128、;p>  <%@ page contentType="application/msexcel;charset=gb2312" %>    </p><p>  response.setHeader("Content-disposition","inline; file

129、name=test1.xls");    </p><p>  //以上這行設(shè)定傳送到前端瀏覽器時(shí)的檔名為test1.xls     </p><p>  //就是靠這一行,讓前端瀏覽器以為接收到一個(gè)excel檔     </p><p>

130、;  下面正常顯示要轉(zhuǎn)化的表    </p><p>  --------------------------------------------------------------------------    </p><p><b>  介紹:    &l

131、t;/b></p><p>  Jakarta_POI 使用Java讀寫(xiě)Excel(97-2002)文件,可以滿(mǎn)足大部分的需要。    </p><p>  因?yàn)閯偤糜幸粋€(gè)項(xiàng)目使用到了這個(gè)工具,花了點(diǎn)時(shí)間順便翻譯了一下POI本身    </p><p>  帶的一個(gè)Gui

132、de.有一些節(jié)減和修改,希望給使用這個(gè)項(xiàng)目的人一些入門(mén)幫助。    </p><p>  POI 下面有幾個(gè)自項(xiàng)目:HSSF用來(lái)實(shí)現(xiàn)Excel 的讀寫(xiě).以下是HSSF的主頁(yè)    </p><p>  http://jakarta.apache.org/poi/hssf/index.html

133、     </p><p>  下面的介紹是基于以下地址的翻譯:    </p><p>  http://jakarta.apache.org/poi/hssf/quick-guide.html     </p><p>  目前的版本為1.51

134、應(yīng)該是很長(zhǎng)時(shí)間之內(nèi)的一個(gè)穩(wěn)定版,但HSSF提供的Sample不是基于    </p><p>  1.51所寫(xiě),所以使用的時(shí)候需要適當(dāng)?shù)淖⒁?    </p><p>  其實(shí)POI下面的幾個(gè)子項(xiàng)目側(cè)重不同讀寫(xiě) Word 的HDF正在開(kāi)發(fā)當(dāng)中.    

135、</p><p>  XML下的FOP(http://xml.apache.org/fop/index.html)     </p><p>  可以輸出pdf文件,也是比較好的一個(gè)工具    </p><p><b>  目錄:    

136、</b></p><p>  創(chuàng)建一個(gè)workbook    </p><p>  創(chuàng)建一個(gè)sheet    </p><p>  創(chuàng)建cells    </p><p>  創(chuàng)建日期cells 

137、60;  </p><p>  設(shè)定單元格格式    </p><p><b>  說(shuō)明:    </b></p><p>  以下可能需要使用到如下的類(lèi)    </p><p> 

138、 import org.apache.poi.hssf.usermodel.HSSFCell;    </p><p>  import org.apache.poi.hssf.usermodel.HSSFCellStyle;    </p><p>  import org.ap

139、ache.poi.hssf.usermodel.HSSFDataFormat;    </p><p>  import org.apache.poi.hssf.usermodel.HSSFFont;    </p><p>  import org.apache.poi.hssf.user

140、model.HSSFRow;    </p><p>  import org.apache.poi.hssf.usermodel.HSSFSheet;    </p><p>  import org.apache.poi.hssf.usermodel.HSSFWorkbook; 

141、;   </p><p>  import org.apache.poi.hssf.util.HSSFColor;    </p><p>  創(chuàng)建workbook    </p><p>  HSSFWorkbook wb =

142、 new HSSFWorkbook();    </p><p>  //使用默認(rèn)的構(gòu)造方法創(chuàng)建workbook     </p><p>  FileOutputStream fileOut = new FileOutputStream("

143、workbook.xls");    </p><p>  //指定文件名     </p><p>  wb.write(fileOut);    </p><p>  //輸出到文件     &

144、lt;/p><p>  fileOut.close();    </p><p>  創(chuàng)建一個(gè)sheet    </p><p>  HSSFWorkbook wb = new HSSFWorkbook();   

145、0;</p><p>  HSSFSheet sheet1 = wb.createSheet("new sheet");    </p><p>  //workbook創(chuàng)建sheet     </p><p>  HSSFSh

146、eet sheet2 = wb.createSheet("second sheet");    </p><p>  //workbook創(chuàng)建另外的sheet     </p><p>  FileOutputStream fileOut&#

147、160;= new FileOutputStream("workbook.xls");    </p><p>  wb.write(fileOut);    </p><p>  fileOut.close();    </

148、p><p>  創(chuàng)建cells    </p><p>  HSSFWorkbook wb = new HSSFWorkbook();    </p><p>  HSSFSheet sheet = wb.createSh

149、eet("new sheet");    </p><p>  //注意以下的代碼很多方法的參數(shù)是short 而不是int 所以需要做一次類(lèi)型轉(zhuǎn)換     </p><p>  HSSFRow row = sheet.createR

150、ow((short)0);    </p><p>  //sheet 創(chuàng)建一行     </p><p>  HSSFCell cell = row.createCell((short)0);    </p><

151、;p>  //行創(chuàng)建一個(gè)單元格     </p><p>  cell.setCellValue(1);    </p><p>  //設(shè)定單元格的值     </p><p>  //值的類(lèi)型參數(shù)有多中double ,Strin

152、g ,boolean,     </p><p>  row.createCell((short)1).setCellValue(1.2);    </p><p>  row.createCell((short)2).setCellValue("This is a

153、60;string");    </p><p>  row.createCell((short)3).setCellValue(true);    </p><p>  // Write the output to a file 

154、    </p><p>  FileOutputStream fileOut = new FileOutputStream("workbook.xls");    </p><p>  wb.write(fileOut);   &

155、#160;</p><p>  fileOut.close();    </p><p>  創(chuàng)建日期cells    </p><p>  HSSFWorkbook wb = new HSSFWorkbook();  

156、0; </p><p>  HSSFSheet sheet = wb.createSheet("new sheet");    </p><p>  HSSFRow row = sheet.createRow((short)0);  

157、;  </p><p>  HSSFCell cell = row.createCell((short)0);    </p><p>  //設(shè)定值為日期     </p><p>  cell.setCellValue(new

158、0;Date());    </p><p>  HSSFCellStyle cellStyle = wb.createCellStyle();    </p><p>  //指定日期顯示格式     </p><p&g

159、t;  cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));    </p><p>  cell = row.createCell((short)1);    </p><p>  

160、cell.setCellValue(new Date());    </p><p>  //設(shè)定單元格日期顯示格式     </p><p>  cell.setCellStyle(cellStyle);    </p><p>  F

161、ileOutputStream fileOut = new FileOutputStream("workbook.xls");    </p><p>  wb.write(fileOut);    </p><p>  fileOut.close()

162、;    </p><p>  設(shè)定單元格格式    </p><p>  單元格格式的設(shè)定有很多形式包括單元格的對(duì)齊方式,內(nèi)容的字體設(shè)置,    </p><p>  單元格的背景色等,因?yàn)樾问奖容^多,只舉一些例子.以下的例子在 

163、60;  </p><p>  POI1.5中可能會(huì)有所改變具體查看API.    </p><p>  ..........    </p><p>  // Aqua background     <

164、;/p><p>  HSSFCellStyle style = wb.createCellStyle();    </p><p>  //創(chuàng)建一個(gè)樣式     </p><p>  style.setFillBackgroundColor(HSSFCellSt

165、yle.AQUA);    </p><p>  //設(shè)定此樣式的的背景顏色填充     </p><p>  style.setFillPattern(HSSFCellStyle.BIG_SPOTS);    </p><p>  //樣式的填充

166、類(lèi)型。     </p><p>  //有多種式樣如:     </p><p>  //HSSFCellStyle.BIG_SPOTS     </p><p>  //HSSFCellStyle.FINE_DOTS   &

167、#160; </p><p>  //HSSFCellStyle.SPARSE_DOTS等     </p><p>  style.setAlignment(HSSFCellStyle.ALIGN_CENTER );    </p><p>  //居中對(duì)齊

168、0;    </p><p>  style.setFillBackgroundColor(HSSFColor.GREEN.index);    </p><p>  //設(shè)定單元個(gè)背景顏色     </p><p>  style.setFillForeg

169、roundColor(HSSFColor.RED.index);    </p><p>  //設(shè)置單元格顯示顏色     </p><p>  HSSFCell cell = row.createCell((short) 1);   &#

溫馨提示

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

評(píng)論

0/150

提交評(píng)論