web导出excel文件的两种格局,ruby获取网页链接

ruby获取网页链接,下载excel文件

 

需求:

获取http://123.57.212.98/html/tm/29/38/68/68.html网站的历届詹天佑奖的excel名单,并且把excel格式转换为csv格式。

第一步
首先取获得此页面全数的excel表个文本的连日,并且下载到本地,思路是用3个类别来放符合要求的有着链接,从队头收取链接,遵照这些链接获得二个新的页面page,再深入分析此page,把此页面包车型大巴兼具备用的链接放入如队列。直到队列为空。(这里有用的链接是能够到达能够获取excel文件的页面)

require "yomu"
require "mechanize"
require "open-uri"

$queue=[]
$queueFile=[]
$queue.push({"zhantianyou" => 'http://123.57.212.98/html/tm/29/38/68/68.html'})
=begin 
    下载所有文件的思路:
    有一个入口的URl,和一个队列,队列中最开始只有一个此入口url,
    根据这个url,获取此页面的所有链接,把链接放到队列中,同时过滤出来 需要的表格url,把表格url保存下来。

=end


    # queue对列中放的是一个 {网页标题 => 网页url } 的散列
while !$queue.empty?
    url=""
    $queue.shift.each_value do |value|
        url=value
    end
   begin
    page=Mechanize.new.get(url)
   rescue 
       puts "---------------------->>>>  #{url} 不能访问"
   end

    page.links.each do |link|
        if link.text.include?('.xls')# 将有用的表格url存起来
            puts link.text
            $queueFile.push({link.text => link.href})
        elsif link.text.include?('詹天佑奖获奖工程及获奖单位名单') || link.text.include?('下一页')# 有用的链接放到队列中,便于下一次访问
            #puts link.text
            $queue.push({link.text=>link.href})
        end
    end
end

# 根据 url 下载到本地
while !$queueFile.empty?
    url=$queueFile.shift
    url.each do |key,value|
        puts key
        File.open('./'+key,"w") do |io|
            io.puts(open(value).read)
        end
    end
end

第二步
excel文件能够平素另存为csv文件,不过格式不是太好,并且会莫名奇妙的少一些数码,后来察觉还足以把excel文件另存为html
文件,那样试了试,开采转成的html文件的格式很好,数据也未曾不当,非常适合提取有用的信息。看上面包车型客车代码

require "yomu"
require "nokogiri"
def getContent(page,dir,io)
    puts dir
    # 得到历届詹天佑奖的时间
    dir =~ /第.+?届/
    title = $&
    dir =~ /[0-9][0-9][0-9][0-9]年度/
    title1=$&
    if title1==nil
        title1=""
    end

    title+=title1
    line=[]
    temp=""
    i=0
    # 获取含符合规范的td,  下面xpath的意思: 匹配含有rowspan 属性的td,或者 不含rowspan 以及 不含colspan 属性的td
    # 为了展现xpath not 的用法,下面的语句有些多余
    page.xpath("//td[ @rowspan or not(@rowspan or @colspan) ]").each do |td|
        # 去掉一些不需要的内容,如表头,
        if td.content =~ /[0-9]$/ || !td.to_s.include?('x:str') || td.content =~ /序号|工程名称|参建单位|编号/
            next
        end
        if td.to_s.include?('rowspan')# 代表着一行开始了
            temp.slice!(-1)# 删除最后一个顿号
            temp.gsub!(/[0-9]-/,"")# 剔除多余的字符
            i+=1
            if i>1# i==1 代表着此表的第一行,由于同一列分布在多行,只有处理到下一行的开始部分才把这一行的数据写入文件,所以i==1时,第一行的数据还没有结束,不能写入文件
                io.puts(temp+","+title.to_s)# 将此行写入文件
                puts "#{i}   #{temp},#{title.to_s}"
            end
            temp=""
            temp <<td.content+","
        else
            temp<<td.content+"、"# 把分布在多行的列连接成一行
        end
    end
    # 处理最后一行数据
    temp.slice!(-1)
    temp.gsub!(/[0-9]-/,"")
    io.puts(temp+","+title.to_s)# 把最后一行的数据写入文件
    puts "#{i+1}   #{temp},#{title.to_s}"
end

io=File.open("./詹天佑奖.csv","w+")# 准备写入数据的文件
io.puts("工程名称,参建单位,时间")# th
Dir.open("./詹天佑/詹天佑html/").each do |dir|# 遍历此文件夹下的所有文件
    if dir=="."||dir==".."# 过滤本目录和上级目录
        next
    end
    f=File.open('./詹天佑/詹天佑html/'+dir)
    page=Nokogiri::HTML(f)
    getContent(page,dir,io)
    f.close
end
io.close

总的来讲,二种艺术:服务器端生成和浏览器端生成。

总结:

开头要求把excel表格文件调换为csv文件时,都以平昔把excel文件另存为csv文件,最后再管理格式,

骨子里转变为html文件更方便处理局地。

服务器端生成正是:依据用户请求,获取相应的数额,使用poi/jxl,
jacob/jawin+excel,或是用多少拼html的table或是cvs纯文本的多少格式等。然后按.xls或是.cvs格式的文本的款式重返给用户,钦赐Content-Type:application/vnd.ms-excel
,浏览器就能够唤醒要下载的文件是excel文件。

poi/jxl,
jacob/jawin生成的是excel的biff格式。html/csv的是文本格式,不另存为excel文件,繁多excel功能是用持续的。jacob/jawin需求服务器端是windows系统,且安装了excel三千之上版本。poi/jxl和html/csv格局的话,服务器端能够跨平台。

浏览器端生成excel文件还尚无特地完善的方案,那是因为js不恐怕管理2进制。大致有以下多少个方案,各有利弊。

1.
activex方式:使用js/vbs调用excel对象,http://setting.iteye.com/blog/219302,有个extjs的gridpanel导出为excel的例子。
(ie+excel)

2.
ie命令方法:将html或是csv输出到open的window,然后使用execCommand的saveas命令,存为csv或xls。
(ie陆 only)

三.
劳务器端中间转播格局:将html的table或是拼接的csv传到服务器端,服务器端再依据Content-Type:application/vnd.ms-excel再次回到,浏览器就能按excel情势管理。与劳务器端拼接相比较,少了二回取数操作。
(all)

  1. data协议格局:对于支撑data协议的浏览器,可以将html或是csv先用js
    base6④管理,然后前缀data:application/vnd.ms-excel;base6四,,就能够使浏览器将里面包车型客车数额当做excel来拍卖,浏览器将唤起下载或展开excel文件,可惜的是ie不辅助。extjs的官方网址有八个grid的plugin,实现导出xhtml格式的伪excel文件,便是这么做的。
    (except IE)

浏览器端唯有首先种方案导出的是实在的biff格式的excel文件,其余方式都以文本格式。activex形式只可以在windows平台的ie浏览器选取,而且要求降低ie的安全性,所以使用相比有限。复杂的excel文件,依然在服务器端用poi/jxl生成excel相比较好。若是浏览器固定位ie陆,浏览器端情势二是最棒的方案。要是要降低服务器端cpu的总括压力,客户端方案叁可行,而且跨平台(比poi/jxl格局少了取数和浮动2进制文件)。倘诺是非ie浏览器,方案四也不失为壹种好点子。

 

ps: 还有1个方案,正是让安装了ie和excel的用户在网页上右键,点击“导出到
Microsoft
Excel”,然后能够挑选要导出的table区域,点“导入”开关,实现导入。

相关文章