yxhxj2006

          常用鏈接

          統(tǒng)計

          最新評論

          POI操作Excel表格

          在我們實(shí)際的開發(fā)中,表現(xiàn)層的解決方案雖然有多樣,但是IE瀏覽器已成為最多人使用的瀏覽器,因?yàn)榇蠹叶加肳indows。在企業(yè)辦公系統(tǒng)中,常常有客戶這樣子要求:你要把我們的報表直接用Excel打開(電信系統(tǒng)、銀行系統(tǒng))。或者是:我們已經(jīng)習(xí)慣用Excel打印。
          Apache的Jakata項(xiàng)目的POI子項(xiàng)目,目前比較成熟的是HSSF接口,處理MSExcel對象。它不象我們僅僅是用csv生成的沒有格式的可以由Excel轉(zhuǎn)換的東西,而是真正的Excel對象,你可以控制一些屬性如sheet,cell等等。
          首先,理解一下一個Excel的文件的組織形式,一個Excel文件對應(yīng)于一個workbook(HSSFWorkbook),一個workbook可以有多個sheet(HSSFSheet)組成,一個sheet是由多個row(HSSFRow)組成,一個row是由多個cell(HSSFCell)組成。
          POI可以到www.apache.org下載到。實(shí)際運(yùn)行時,需要有poi包就可以了。HSSF提供給用戶使用的對象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel對象,樣式和格式,還有輔助操作。有以下幾種對象:
          HSSFWorkbook excel的文檔對象
          HSSFSheet excel的表單
          HSSFRow excel的行
          HSSFCell excel的格子單元
          HSSFFont excel字體
          HSSFDataFormat 日期格式
          在poi1.7中才有以下2項(xiàng):
          HSSFHeader sheet頭
          HSSFFooter sheet尾(只有打印的時候才能看到效果)
          和這個樣式
          HSSFCellStyle cell樣式
          輔助操作包括
          HSSFDateUtil 日期
          HSSFPrintSetup 打印
          HSSFErrorConstants 錯誤信息表
          以下可能需要使用到如下的類
          import org.apache.poi.hssf.usermodel.HSSFCell;
           import org.apache.poi.hssf.usermodel.HSSFCellStyle;
           import org.apache.poi.hssf.usermodel.HSSFDataFormat;
          import org.apache.poi.hssf.usermodel.HSSFFont;
           import org.apache.poi.hssf.usermodel.HSSFRow;
           import org.apache.poi.hssf.usermodel.HSSFSheet;
          import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor;
          先看poi的examples包中提供的最簡單的例子,建立一個空xls文件。
          import java.io.FileOutputStream;
          import java.io.IOException;
          import org.apache.poi.hssf.usermodel.HSSFWorkbook;
          public class ExcelSample1 {
          public static void main(String[] args) throws IOException {
          //創(chuàng)建一個excel文件
          HSSFWorkbook wb= new HSSFWorkbook();
          FileOutputStream fileOut= new FileOutputStream("c:\\workbook.xls");
          // FileOutputStream fileOut= new FileOutputStream("c:/workbook.xls");
          wb.write(fileOut);
          fileOut.close();
          }
          }
          通過這個例子,我們在c盤下建立的是一個空白的xls文件(不是空文件)。
          在此基礎(chǔ)上,我們可以進(jìn)一步看其它的例子。
          import org.apache.poi.hssf.usermodel.*;
          import java.io.FileOutputStream;
          import java.io.IOException;
          public class CreateCells
          {
          public static void main(String[] args) throws IOException
          {
          HSSFWorkbook wb = new HSSFWorkbook(); //建立新HSSFWorkbook對象
          HSSFSheet sheet = wb.createSheet("new sheet"); //建立新的sheet對象
          HSSFRow row = sheet.createRow((short)0);
          //在sheet里創(chuàng)建一行,參數(shù)為行號(第一行,此處可想象成數(shù)組)
          HSSFCell cell = row.createCell((short)0);
          //在row里建立新cell(單元格),參數(shù)為列號(第一列)
          cell.setCellvalue(1); //設(shè)置cell的整數(shù)類型的值
          row.createCell((short)1).setCellvalue(1.2); //設(shè)置cell浮點(diǎn)類型的值
          row.createCell((short)2).setCellvalue("test"); //設(shè)置cell字符類型的值
          row.createCell((short)3).setCellvalue(true); //設(shè)置cell布爾類型的值
          HSSFCellStyle cellStyle = wb.createCellStyle(); //建立新的cell樣式
          cellStyle.setDataFormat(HSSFDataFormat. getBuiltinFormat("m/d/yy h:mm"));
          //設(shè)置cell樣式為定制的日期格式
          HSSFCell dCell =row.createCell((short)4);
          dCell.setCellvalue(new Date()); //設(shè)置cell為日期類型的值
          dCell.setCellStyle(cellStyle); //設(shè)置該cell日期的顯示格式
          HSSFCell csCell =row.createCell((short)5);
          csCell.setEncoding(HSSFCell.ENCODING_UTF_16);
          //設(shè)置cell編碼解決中文高位字節(jié)截斷
          csCell.setCellvalue("中文測試_Chinese Words Test"); //設(shè)置中西文結(jié)合字符串
          row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);
          //建立錯誤cell
          FileOutputStream fileOut = new FileOutputStream("workbook.xls");
          wb.write(fileOut);
          fileOut.close();
          }
          }
          通過這個例子,我們可以清楚的看到xls文件從大到小包括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell這樣幾個對象。我們可以在cell中設(shè)置各種類型的值。尤其要注意的是如果你想正確的顯示非歐美的字符時,尤其象中日韓這樣的語言,必須設(shè)置編碼為16位的即是HSSFCell.ENCODING_UTF_16,才能保證字符的高8位不被截斷而引起編碼失真形成亂碼。其他測試可以通過參考examples包中的測試?yán)诱莆誴oi的詳細(xì)用法,包括字體的設(shè)置,cell大小和低紋的設(shè)置等。需要注意的是POI是一個仍然在完善中的公開代碼的項(xiàng)目,所以有些功能正在不斷的擴(kuò)充。
          感覺上面的操作比較的繁瑣,然后就自己寫了一個方法。這個方法不需要事先創(chuàng)建row和cell,直接進(jìn)行cteateCell就可以了,在程序中會自動進(jìn)行判斷,如果不存在的話會創(chuàng)建。
          private static void cteateCell(HSSFWorkbook wb,HSSFRow row,short col,short align,String val){
          HSSFCell cell = row.createCell(col);
          cell.setEncoding(HSSFCell.ENCODING_UTF_16);
          cell.setCellValue(val);
          HSSFCellStyle cellstyle = wb.createCellStyle();
          cellstyle.setAlignment(align);
          cell.setCellStyle(cellstyle);
          }
          對里面的幾個參數(shù)的說明:
          short col 應(yīng)該是你的cell單元格的位置也就是列號;
          short align 應(yīng)該是你的對齊方式;
          String val 應(yīng)該是你單元格里面要添加的值;
          具體的調(diào)用如下:
          HSSFRow row = sheet.createRow((short)1);
          cteateCell(wb,row,(short)0,HSSFCellStyle.ALIGN_CENTER_SELECTION,"SampleID");
          在上邊的例子里我們看到了要設(shè)置一個單元格里面信息的格式(例如,要將信息居中)設(shè)置的操作如下:
          HSSFCellStyle cellstyle = wb.createCellStyle();
          cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);
          cell.setCellStyle(cellstyle);
          還有我們我們經(jīng)常會用到的合并單元格,在這里我們也有這樣的操作,代碼如下:
          sheet.addMergedRegion(new Region(1,(short)1,2,(short)4));
           這里面我們還要介紹一個經(jīng)常會遇到的問題,就是怎么來凍結(jié)一個窗口。poi也為我們集成了這樣的事情了。代碼如下:
          sheet.createFreezePane(1,2);
          λ 在這里我們需要注意的是
          一、該方法是在一個具體的sheet里面來進(jìn)行操作。
          二、方法createFreezepane;有2個參數(shù)。前一個參數(shù)代表列;后一個參數(shù)代表行。
          上邊的代碼對應(yīng)的excel文件如下:

          posted on 2012-08-09 16:45 奮斗成就男人 閱讀(941) 評論(1)  編輯  收藏 所屬分類: java

          評論

          # re: POI操作Excel表格[未登錄] 2015-09-09 15:43 不懂

          有一個問題實(shí)在是看不懂,在創(chuàng)建cell的時候;
          createCell((short)0)中的short的是干什么用的在這表示的是什么;為什么要在這個地方用short,不是表示具體的位置嗎,用坐標(biāo)或者序號就好啊,求大神解答;  回復(fù)  更多評論   

          主站蜘蛛池模板: 调兵山市| 静宁县| 灵璧县| 肇州县| 辽中县| 甘德县| 鸡西市| 威信县| 喀喇沁旗| 神木县| 宝应县| 九龙城区| 闸北区| 资源县| 钟山县| 绥化市| 南陵县| 彰武县| 浦东新区| 德惠市| 阿克苏市| 文成县| 米泉市| 通道| 富民县| 西充县| 重庆市| 咸丰县| 呼玛县| 阿图什市| 济源市| 台前县| 临猗县| 曲周县| 来宾市| 岑巩县| 北安市| 遂平县| 炎陵县| 醴陵市| 三亚市|