POI版本 :3.0.2-FINAL


下载地址 : http://poi.apache.org


一般在项目中真正要实现这样一个表格的时候,例如项目需要制作报表等等,通常的做法都是事先把格式一切的东西都手动制作好(这个做好了的文件在实际的项目里我们称之为“数据模板”,简称“模板”),然后在Java应用中适当的时机把这个文件读进来修改,最后再另存到指定的位置或者传递给下一个处理者(例如以流的方式送给Servlet等等),这样其实POI具体做的事情就是向模板里写业务的数据,还是很方便快捷的。


一、 POI 读取 Excel 基本工作


   1. // 指定要读取的文件,本例使用上面生成的helloworld.xls


              FileInputStream readFile = new FileInputStream("c:/ceshi.xls");


       // 创建一个WorkBook,从指定的文件流中创建,即上面指定了的文件流


         HSSFWorkbook wb = new HSSFWorkbook(readFile);


       // 获取名称为“测试页”的sheet


       // 注意,如果不能确定具体的名称,可以用getSheetAt(int)方法取得Sheet


       //HSSFSheet st = wb.getSheet("测试页");


              HSSFSheet st = wb.getSheetAt(0);


     //创建样式表,样式表可以设置单元格的一些属性 比如背景色,锁定状态,行列宽高等


     HSSFCellStyle normalStyle = wb.createCellStyle();


     //以下列方式存储当前单元格样式


单元格对象.setCellStyle(normalStyle);


二、设置模板与建立行和列



1. 如果预先的模板有内容的话,在操作的时候则只需要读去当前单元格的内容以及样式,或者可以重新定义。(如果没有内容,又想以读去的方式来获取Excel的话,需要手动初始化模板,如给模板中需要用到的单元格设置边框或者背景色等)



例如



HSSFRow row = st.getRow(0);        //读取第一行



HSSFCell cell = row.getCell((short)0); //读取第一行第一个字段



2. 如果模板中无内容的话,则需要在代码中创建初始化行和列来达到目的



例如



HSSFRow row = st.createRow(0);         //创建第一行



HSSFCell cell = row.createCell((short)0); //以第一行为基础创建第一列



三、模板的只读单元格功能与 POI 关系



  1. 在Excel中可以设置某些单元格为锁定状态(即:只读状态),设置好后还不能生效,因为要通过点击 工具—保护—保护工作表,输入密码达到效果,在选择保护工作表项目中可以控制只读的属性(具体看需求):如不能修改样式名称,可以修改行列大小或者删除行列,还有个选项是选定锁定单元格,如果把这个钩选取消了,则只读时点击不到被设置只读保护的单元格,也不会出现不能修改属性的提示框。
  2. 如果我们需要这些只读的单元格的功能的话,则需要在模板中设置,通过POI来读取后再生成的EXCEL 也会保留此功能,还可以通过POI在读取模板后设置哪些字段为锁定状态:

          例:    HSSFCellStyle alterableStyle = wb.createCellStyle(); //获取当前单元格的样式对象



alterableStyle.setLocked(true);     //设定此单元格为锁定状态



       如果在选择模板EXCEL不需要设置只读的属性时候(即:默认属性)则可以不用在模板中选择保护工作表 ,同样可以在POI中实现



          例:



                      st.protectSheet(new String("333")); //当前工作表为保护状态 密码为333



(需知:设置只读属性的允许删除行和列的选项时,如果当前行或者列 有已经被设定为锁定的单元格时,则此列或者行不能被删除)




四、安全问题



由于模板需要受到保护,建议在建立模板的时候 设置保护工作表 另外最好可以找到工作以锁定模板的VBA工程窗口,这样POI读取模板后 生成的EXCELVBA工程窗口也自动被锁定, 以防止破解 模板的工作表密码