`
renzhen
  • 浏览: 248039 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用JRuby读取Excel文件

阅读更多
  最近经常要替客户做一些二次开发,其中要涉及到数据间的转换,这是客户就会发来一个Excel文件,其中记录着数据间的关系,比如:001代表经理等,而我将这些数据转成其它的形式,如:php的array形式或放到一个数据库表中等等。
  Ruby则是我处理这类事的利器,它内置了CSV的操作,可以轻松处理表格数据,以前,我经常将客户发给我的Excel另存为CSV,然后处理,我非常喜欢CSV类库读取文件的语法,感觉它非常的优美,当然,Ruby类库的语法都很舒服,写Ruby这是享受。
 
    CSV.open("code.csv","r") do |row|
      #process each csv row
    end

  

  直到一个客户,它的数据转换信息很多,在一个Excel中,不同的转换内容放在不同的Sheet中,我要将sheet一个个另存为csv,然后处理?No,于是我想还是找一个处理Excel的类库,由于我比较熟悉Java,找到了JXL类库。并通过JRuby调用JXL完成转换。代码如下:
 
 require 'java'
require 'jar/jxl.jar'

def jxl
  Java::Jxl
end

import jxl.Workbook
import jxl.Sheet
import jxl.Cell

cities=[]
workbook=Workbook.getWorkbook(java.io.File.new("Customer_Desc.xls"))
sheet=workbook.getSheet(0)
rownum=sheet.getRows
0.upto(rownum-1) do |i|
  #process each row
  cells=sheet.getRow(i)
  cells.each{|cell| 
    #process each cell
  }
end
workbook.close


  

  真是不舒服,比起CSV类库的写法,这太丑了,于是我对JXL进行了封装,使其尽量和CSV类库操作相一致,现在封装效果如下:
   Excel.open("Customer_Desc.xls") do |wb|
     wb.each{|sheet| 
        sheet.each{|row|
          #process with each row
        }
     }
  
     wb.current_sheet.each{|row|
        #process with each row
     }

      wb.sheet(sheetnum or sheetname).each{|row|
        #process with each row
      }
   end
 

  由于我只用到了Excel的读取,就没有将写入Excel做封装,对Cell的处理,也仅仅是通过getContent函数把它变成字符串,没有办法处理超链接等特殊的格式,不过对我而言,够用就好
  • jxl.rar (648.8 KB)
  • 下载次数: 9
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics