亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

使用poi操作Excel的幾點注意事項

2019-11-18 12:00:00
字體:
來源:轉載
供稿:網友

  上好的人肉包子新鮮出爐啦,各位妖魔鬼怪趕緊來嘗嘗鮮……
  
  首先說說現在我所知道的java編輯Excel文件的兩大開源工具:jakarta poi和JavaExcelAPI(簡稱JXL),這兩套工具我都試用了一這段時間,感覺各有優劣吧。poi在某些細節有些小Bug并且不支持寫入圖片,其他方面都挺不錯的;JXL就慘了,除了支持寫入圖片外,我暫時看不到它比POI好的地方,我碰到的主要的問題就是對公式支持不是很好,很多帶有公式的Excel文件用JXL打開后,公式就丟失了(比如now(),today()),在網上看到其他大蝦評論說JXL寫入公式也有問題,另外,JXL操作Excel文件的效率比POI低一點。經過比較后,我選擇了poi開發我的項目。
  
  現在我要做的東西基本完成啦,我把這段時間使用poi的一些心得總結出來,希望能對和我碰到相同問題的朋友有所幫助,少熬幾個夜,多點時間陪MM:),至于poi基本的使用方法,自己去看文檔吧。
  
  1、設置分頁符的bug。
  
  poi里的HSSFSheet類提供了setRowBreak方法可以設置Sheet的分頁符。
  
  Bug:假如你要設置分頁符的Sheet是本來就有的,并且你沒有在里面插入過分頁符,那么調用setRowBreak時POI會拋出空指針的異常。
  
  解決方法:在Excel里給這個sheet插入一個分頁符,用POI打開后再把它刪掉,然后你就可以隨意插入分頁符了。
  
  假如sheet是由poi生成的則沒有這個問題。我跟蹤了setRowBreak的源代碼,發現是Sheet.java下的PageBreakRecord rowBreaks這個變量在搞鬼,假如Sheet里原來沒有分頁符,開發這個模塊的那位兄臺忘了為這個對象new實例,所以只能我們先手工給Excel插入一個分頁符來觸發poi為rowBreaks創建實例。
  
  2、如何拷貝行。
  
  我在gmane.org的poi用戶論壇翻遍了每個相關的帖子,找遍了api,也沒看到一個拷貝行的方法,沒辦法,只能自己寫:
  
  //注:this.fWorkbook是一個HSSHWorkbook,請自行在外部new
  public void copyRows(String pSourceSheetName, String pTargetSheetName, int pStartRow, int pEndRow, int pPosition)
  {
  HSSFRow sourceRow = null;
  HSSFRow targetRow = null;
  HSSFCell sourceCell = null;
  HSSFCell targetCell = null;
  HSSFSheet sourceSheet = null;
  HSSFSheet targetSheet = null;
  Region region = null;
  int cType;
  int i;
  short j;
  int targetRowFrom;
  int targetRowTo;
  
  if ((pStartRow == -1) (pEndRow == -1))
  {
  return;
  }
  sourceSheet = this.fWorkbook.getSheet(pSourceSheetName);
  targetSheet = this.fWorkbook.getSheet(pTargetSheetName);
  //拷貝合并的單元格
  for (i = 0; i < sourceSheet.getNumMergedRegions(); i++)
  {
  region = sourceSheet.getMergedRegionAt(i);
  if ((region.getRowFrom() >= pStartRow) && (region.getRowTo() <= pEndRow))
  {
  targetRowFrom = region.getRowFrom() - pStartRow + pPosition;
  targetRowTo = region.getRowTo() - pStartRow + pPosition;
  region.setRowFrom(targetRowFrom);
  region.setRowTo(targetRowTo);
  targetSheet.addMergedRegion(region);
  }
  }
  //設置列寬
  for (i = pStartRow; i <= pEndRow; i++)
  {
  sourceRow = sourceSheet.getRow(i);
  if (sourceRow != null)
  {
  for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)
  {
  targetSheet.setColumnWidth(j, sourceSheet.getColumnWidth(j));
  }
  break;
  }
  }
  //拷貝行并填充數據
  for (;i <= pEndRow; i++)
  {
  sourceRow = sourceSheet.getRow(i);
  if (sourceRow == null)
  {
  continue;
  }
  targetRow = targetSheet.createRow(i - pStartRow + pPosition);
  targetRow.setHeight(sourceRow.getHeight());
  for (j = sourceRow.getFirstCellNum(); j < sourceRow.getLastCellNum(); j++)
  {
  sourceCell = sourceRow.getCell(j);
  if (sourceCell == null)
  {
  continue;
  }
  targetCell = targetRow.createCell(j);
  targetCell.setEncoding(sourceCell.getEncoding());
  targetCell.setCellStyle(sourceCell.getCellStyle());
  cType = sourceCell.getCellType();
  targetCell.setCellType(cType);
  switch (cType)
  {
  case HSSFCell.CELL_TYPE_BOOLEAN:
  targetCell.setCellValue(sourceCell.getBooleanCellValue());
  break;
  case HSSFCell.CELL_TYPE_ERROR:
  targetCell.setCellErrorValue(sourceCell.getErrorCellValue());
  break;
  case HSSFCell.CELL_TYPE_FORMULA:
  //parseFormula這個函數的用途在后面說明
  targetCell.setCellFormula(parseFormula(sourceCell.getCellFormula()));
  break;
  case HSSFCell.CELL_TYPE_NUMERIC:
  targetCell.setCellValue(sourceCell.getNumericCellValue());
  break;
  case HSSFCell.CELL_TYPE_STRING:
  targetCell.setCellValue(sourceCell.getStringCellValue());
  break;
  }
  }
  }
  }
  
  這個函數有兩個問題暫時無法解決:
  
  a、只能在同一個Workbook里面使用,跨Workbook總是拷不過去,不知道為什么?
  
  b、由于在拷貝行時也把行高也拷過去了,假如往這些單元格里寫入的數據長度超過單元格長度,那么他們不會自動調整行高!
  
  有哪位大俠知道上面兩個問題任意一個的解決方法,請第一時間通知我?。?!
  
  3、公式的問題。
  
  POI對Excel公式的支持是相當好的,但是我發現一個問題,假如公式里面的函數不帶參數,比如now()或today(),那么你通過getCellFormula()取出來的值就是now(ATTR(semiVolatile))和today(ATTR(semiVolatile)),這樣的值寫入Excel是會出錯的,這也是我上面copyRow的函數在寫入公式前要調用parseFormula的原因,parseFormula這個函數的功能很簡單,就是把ATTR(semiVolatile)刪掉,我把它的代碼貼出來:
  PRivate String parseFormula(String pPOIFormula)
  {
  final String cstReplaceString = "ATTR(semiVolatile)"; //$NON-NLS-1$
  StringBuffer result = null;
  int index;
  
  result = new StringBuffer();
  index = pPOIFormula.indexOf(cstReplaceString);
  if (index >= 0)
  {
  result.append(pPOIFormula.substring(0, index));
  result.append(pPOIFormula.substring(index + cstReplaceString.length()));
  }
  else
  {
  result.append(pPOIFormula);
  }
  
  return result.toString();
  }
  至于為什么會出現ATTR(semiVolatile),希望哪位大俠現身跟我解釋一下。
  
  4、向Excel寫入圖片的問題。
  
  我上poi論壇查相關帖子,得到兩種結論:1、不支持寫入圖片;2、支持寫入圖片,通過EscherGraphics2d這個Class實現。于是我就去查EscherGraphics2d這個Class,發現這個Class提供了N個drawImage方法,喜出望外的我開始寫代碼,結果調了一天,一直看不到效果,黔驢技窮的我在萬般無奈下只好跟蹤進drawImage這個函數內部,經過N個函數調用后在最底層函數發現了最終答案(偶當場暴走?。。。?br />  
  public boolean drawImage(Image image, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1,
  int sx2, int sy2, Color bgColor, ImageObserver imageobserver)
  {
  if (logger.check( POILogger.WARN ))
  logger.log(POILogger.WARN,"drawImage() not supported");
  return true;
  }
  所以我強烈建議大家,以后使用第三方開發包一定盡量下載它的源代碼,這樣你在碰到問題時,看看它的的內部是怎么實現的,很多時候就可以不必重蹈我的覆轍了。既然POI不能寫入圖片,那我們只能把目光投向JXL,我用JXL寫入圖片功能是實現了,付出的代價是now()和today()這些函數丟失掉了,魚與熊掌不能兼得吧,至于怎么解決JXL公式的問題,到下面這個帖子里和我一起守株待兔吧:
  
  http://community.csdn.net/EXPert/topic/3569/3569340.xml?temp=.8480646
  
  好了我所知道得就這些,我接觸poi也才幾星期時間,上面有些內容可能說得并不正確,希望各位大蝦砸磚指正!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美第一黄网免费网站| 亚洲精品永久免费精品| 欧美电影免费观看高清| 亚洲精品影视在线观看| 亚洲人在线观看| 日本免费一区二区三区视频观看| 欧美最猛性xxxxx(亚洲精品)| 日韩av在线不卡| 亚洲欧美综合图区| 91免费看视频.| 欧美亚洲日本黄色| 九九热r在线视频精品| 国产成人黄色av| 日本电影亚洲天堂| 久久久电影免费观看完整版| 亚洲乱码av中文一区二区| 九九九久久国产免费| 亚洲色图在线观看| 久久影院模特热| 亚洲精品电影久久久| 亚洲欧洲在线免费| 日韩精品在线观看网站| 97免费视频在线播放| 日韩美女av在线免费观看| 国产狼人综合免费视频| 欧美成人午夜激情视频| 亚洲自拍偷拍第一页| 久久视频在线视频| 欧美另类在线观看| 日韩欧美在线网址| 日韩精品免费电影| 91免费高清视频| 亚洲精品乱码久久久久久按摩观| 国产欧美va欧美va香蕉在| 国产成人极品视频| 中文字幕一区二区三区电影| 久久综合国产精品台湾中文娱乐网| 欧美裸体xxxx极品少妇| 亚洲国产高潮在线观看| 成人黄色生活片| 欧美国产视频一区二区| 欧美精品在线网站| 精品无人国产偷自产在线| 亚洲欧美日韩中文在线| 中文综合在线观看| 久久九九精品99国产精品| 亚洲综合日韩在线| 国产精品自产拍在线观看中文| 日韩免费在线观看视频| 成人网页在线免费观看| 国产精品视频永久免费播放| 亚洲福利视频在线| 欧美激情二区三区| 欧美大全免费观看电视剧大泉洋| 91成人国产在线观看| 久久免费视频网| 亚洲精品久久久久久下一站| 91精品国产91久久久久久最新| 97精品国产97久久久久久免费| 日韩免费观看在线观看| 日韩一区二区精品视频| 日韩美女毛茸茸| 国产精品自拍视频| 2019中文字幕免费视频| 国语自产偷拍精品视频偷| 91豆花精品一区| 久久精品99久久久香蕉| 精品久久久在线观看| 欧美日韩精品中文字幕| 亚洲精品v欧美精品v日韩精品| 亚洲天堂av综合网| 国产精品久久久久久久一区探花| 欧美在线xxx| 在线视频国产日韩| 97久久精品人人澡人人爽缅北| 日韩国产欧美精品在线| 久久夜色撩人精品| 亚洲大尺度美女在线| 欧美专区中文字幕| 亚洲全黄一级网站| 欧美日韩aaaa| 中文在线资源观看视频网站免费不卡| 91在线精品视频| 欧美激情2020午夜免费观看| 51视频国产精品一区二区| 欧美中文字幕精品| 国语自产精品视频在线看抢先版图片| 97久久国产精品| 国产精品久久久久久超碰| 久精品免费视频| 97国产精品人人爽人人做| 爱福利视频一区| 久久久在线视频| 国产精品综合网站| 欧美日韩第一页| 亚洲欧美日韩中文在线| 欧美劲爆第一页| 日韩少妇与小伙激情| 欧美视频国产精品| 亚洲一区二区中文字幕| 欧美国产日韩中文字幕在线| 欧美大片免费看| 欧美激情精品久久久久久久变态| 91精品久久久久久久久久| 搡老女人一区二区三区视频tv| 91精品视频在线免费观看| 日韩在线中文字幕| 91美女片黄在线观看游戏| 国内精品久久久久久中文字幕| 另类图片亚洲另类| 日韩电影在线观看永久视频免费网站| 精品调教chinesegay| 午夜精品久久久久久久久久久久| 日韩av网站导航| 日韩美女免费观看| 国产日韩欧美黄色| 中文字幕日韩精品在线| 国产午夜精品美女视频明星a级| 懂色aⅴ精品一区二区三区蜜月| 国产91ⅴ在线精品免费观看| 亚洲人成电影网站色…| 国产精品国产福利国产秒拍| 国产做受69高潮| 国产视频精品一区二区三区| 亚洲va久久久噜噜噜| 久久久久中文字幕2018| 国产做受69高潮| 高清一区二区三区四区五区| 中日韩美女免费视频网址在线观看| 国产精欧美一区二区三区| 91精品久久久久久久| 欧洲日韩成人av| 亚洲激情在线观看视频免费| 欧美激情视频网站| 最好看的2019年中文视频| 久久精品亚洲国产| 日韩精品视频在线免费观看| 国产亚洲精品激情久久| 最近2019中文字幕一页二页| 欧美一区二区视频97| 亚洲一区二区三区在线免费观看| 伊人久久久久久久久久久久久| 国产精品极品美女在线观看免费| 亚洲国产精品推荐| 欧美精品福利视频| 美女国内精品自产拍在线播放| 91九色单男在线观看| 91伊人影院在线播放| 色诱女教师一区二区三区| 国产精品欧美一区二区三区奶水| 欧美性受xxxx黑人猛交| 国产精品久久久久久超碰| 日本午夜人人精品| 中文字幕亚洲激情| 91久久国产综合久久91精品网站| 亚洲大胆人体av| 国产精品99久久久久久人| 久久伊人色综合| 最好看的2019的中文字幕视频| 亚洲精品91美女久久久久久久| 成人免费福利视频| 久久91亚洲精品中文字幕奶水| 亚洲欧美国产va在线影院| 久久精品福利视频|