Sparta Yew

     简约、职业、恒久
随笔 - 15, 文章 - 1, 评论 - 276, 引用 - 0
数据加载中……

JXL读写Excle2003


sparta-紫杉 2010-9-28 9:32

JXL官网(http://jexcelapi.sourceforge.net/
POI官网(http://poi.apache.org/

注: 目前JXL暂不能支持Excel2007格式。 但POI是可以的。


一、环境
    
     
jxl.jar(2.4.2), eclipse3.4.2, jdk1.4.2, oracle9.2.0.1, weblogic8.12。

     jxl为开源项目,在对Excle操作时比较方便。

二、背景

    在系统项目中,是使用Jxl来读Excle,以完成从Excle的内容导入到系统数据库的功能。

    但在“成本管理 - 维修费导入”功能中, 用户需要下载相关的“示例文件”。 “示例文件”中为了实现用户的“选择录入”
    (即通过Excel的 数据-有效性-序列 实现用户下拉选择相关的内容进行输入),提前预置了两列基础数据,分别为
    “维修费类别名称”和“服务商名称”, 这两列数据在数据库中是不断更新的, 而这种更新需要及时反映到该“示例文件”的Excel中,
    就是说, 数据库中的数据和示例文件中的数据是相同的,才能使用户可以选择录入完整的数据。

    基于上述需要,需要对Jxl对Excel的读、写及更新操作进行研究。


三、 Jxl读Excel的完整代码

 public static void main(String[] args){
     
         String filePath 
= "c:/维修费示例数据格式表.xls";
     
     
try {
      
           Workbook wb 
= Workbook.getWorkbook( new File( filePath ) );
   
           
int sheetCount = wb.getNumberOfSheets();
   
           
//逐个sheet表读数据
       for ( int i = 0; i < sheetCount; i++){
    
                Sheet sheet 
= wb.getSheet(i);
    
            
ifnull != sheet ){
     
     
                //逐行逐列读取数据
                     int cols = sheet.getColumns();
                     
int rows = sheet.getRows();
     
                 
for(int j = 0; j < cols; j++){
      
                      
forint k = 0; k < rows; k++){
                               
//显示各行列数据
                               System.out.println( sheet.getCell( j, k ).getContents() );
                          }

                     }

                }

        }

   
  }
 catch (BiffException e) {
           
// TODO Auto-generated catch block
           e.printStackTrace();
  }
 catch (IOException e) {
           
// TODO Auto-generated catch block
           e.printStackTrace();
  }

     
}

   
四、Jxl更新Excel的完整代码
    
    这里的更新,指的是对已有的Excel文件的某个Sheet表中的某个或某些单元格进行更新(前提是这些单元格里面已经有数据了)。

    更新Excle,吐血推荐需要重点注意的两点:
    1、在对单元格进行setString之后,要进行Write(),否则不会写入(具体表现为被操作的Excle文件提示“文件格式不对”无法打开,文件遭损坏)。
    2、是在Excel中的单元格不能为空(是已经有数据了), 若为空,则会提示数据类型不对异常无法更新。
       不过,可以通过在需要更新的单元格中预置一个或多个空格就可以了(Jxl默认对存在的空格视为Lable),可以允许更新。

    代码如下:

 /**
     * 与{
@link #SynchronizationUpdate()}相配套,
     * 以完成"服务商名称"在"示例文件"中与数据库的同步更新。
     * 
     * 
@param filePath
     *        示例文件Excel的完整路径。
     * 
     *
@author sparta 2010-9-26
     *
     *
@return void
     
*/

    
public void UpdateServiceProviders( String filePath ){
     
                 CmResultSet rs 
= null;

                  
//定义存放"服务商"名称的变量
                  ArrayList ServicesList = new ArrayList();

                  
// 提取"服务商"的名称并排序
                  String sql = "select distinct qymc from htgl_fwsgl_fwsjbxx " +
                                        
"where (fwdwid,xh) in " +
                                         
"(select fwdwid,max(xh) from htgl_fwsgl_fwsjbxx " +
                                         
"where (whfwdwstate=0 or whfwdwstate=4) " +
                                         
"group by fwdwid) order by qymc";

              
try {

                           ConnectDB connectDB 
= new ConnectDB();
                           rs 
= connectDB.getRs(sql, null);

                           
// 提取"服务商"名称并暂放到List中,以备更新到Excel中。
                       while (rs.next()) {

                                    ServicesList.add(rs.getString(
0));
    
                            }

                 }
 catch (Exception ex) {
                           ex.printStackTrace();
                           logger.error(
"::::::::::::数据库连接失效,维修费导入-同步更新'示例文件'的"
                                         
+ "'服务商名称'失败!");
                           
return;
              }


  
try {
           Workbook wb 
= Workbook.getWorkbook(new File(filePath));

           File targetFile 
= new File(filePath);
           WritableWorkbook wwb 
= Workbook.createWorkbook(targetFile, wb);

           WritableSheet sheet 
= wwb.getSheet("DB");

       
if (null != sheet) {
            
for (int i = 0; i < ServicesList.size(); i++{

                     WritableCell cell 
= sheet.getWritableCell( 3, i );

                     
//单元格中若为空,则不允许更新
                 if ( cell.getType() == CellType.LABEL ) {
                          Label l 
= (Label) cell;
                          l.setString( ServicesList.get(i).toString() );

                     }

                }

           }

           
// 更新到Excel(必须)。
           wwb.write();

           
// 在使用后释放文件流。
           wwb.close();
           wb.close();

  }
 catch (Exception e) {
           e.printStackTrace();
           logger.error(
"::::::::::::写入Excel出现错误,维修费导入-同步更新"
                 
+ "'示例文件'的'服务商名称'失败!");
  }

}


五、Jxl写Excle的完整代码
    
    这里的写,指的是建立Sheet,或增加单元格,完全是在一个新的文件、或新的Sheet、或新的单元格中操作。

public static void main(String[] args){
     
         String filePath 
= "c:/维修费示例数据格式表.xls";
     
     
try {
      
               
//建立工作薄
               WritableWorkbook wb = Workbook.createWorkbook( new File( filePath ) );
   
   
            //建立sheet表
               WritableSheet sheet = wb.createSheet("DB2"2);
   
               
//增加单元格并写入数据
           try {
    
                    sheet.addCell( 
new Label(01"书目ID")  );
                    sheet.addCell( 
new Label(11"ISBN")  );
                    sheet.addCell( 
new Label(21"定价")  );
                    sheet.addCell( 
new Label(31"书名")  );
    
           }
 catch (RowsExceededException e) {
                    e.printStackTrace();
     }
 catch (WriteException e) {
                    e.printStackTrace();
     }

   
   
//写入工作簿
   wb.write();
   
   
//关闭工作薄
   try {
    wb.close();
   }
 catch (WriteException e) {
    e.printStackTrace();
   }

   
  }
 catch (IOException e) {
   e.printStackTrace();
  }


}


    哈哈,就这么多了,涵盖了Jxl读、写、更新Excle2003的相关代码,希望看到的人能够获得一点启示,就会心满意足。



            -东营 sparta-紫杉 原创,转载请注明出处 :)
            http://www.blogjava.net/SpartaYew/
            SpartaYew@163.com
 
            
QQ:22086526

posted on 2011-05-18 16:01 sparta-紫杉 阅读(686) 评论(0)  编辑  收藏 所属分类: Java


只有注册用户登录后才能发表评论。


网站导航: