def write(filepath=@filepath)
filepath of xlsx file (including file itself)
def write(filepath=@filepath)
validate_before_write
if !(filepath =~ /(.+)\.xls(x|m)/)
raise "Only xlsx and xlsm files are supported. Unsupported type for file: #{filepath}"
end
dirpath = ''
extension = 'xls'
if(filepath =~ /((.|\s)*)\.xls(x|m)$/)
dirpath = $1.to_s()
extension += $3.to_s
end
filename = ''
if(filepath =~ /\/((.|\s)*)\/((.|\s)*)\.xls(x|m)$/)
filename = $3.to_s()
end
#creates zip file, writes each type of file to zip folder
#zips package and renames it to xlsx.
zippath = File.join(dirpath, filename + '.zip')
File.unlink(zippath) if File.exists?(zippath)
FileUtils.mkdir_p(File.join(dirpath,zippath))
Zip::ZipFile.open(zippath, Zip::ZipFile::CREATE) do |zipfile|
writer = Writer::ContentTypesWriter.new(dirpath,self)
zipfile.get_output_stream('[Content_Types].xml') {|f| f.puts(writer.write())}
writer = Writer::RootRelsWriter.new(dirpath,self)
zipfile.get_output_stream(File.join('_rels','.rels')) {|f| f.puts(writer.write())}
writer = Writer::AppWriter.new(dirpath,self)
zipfile.get_output_stream(File.join('docProps','app.xml')) {|f| f.puts(writer.write())}
writer = Writer::CoreWriter.new(dirpath,self)
zipfile.get_output_stream(File.join('docProps','core.xml')) {|f| f.puts(writer.write())}
writer = Writer::ThemeWriter.new(dirpath,self)
zipfile.get_output_stream(File.join('xl','theme','theme1.xml')) {|f| f.puts(writer.write())}
writer = Writer::WorkbookRelsWriter.new(dirpath,self)
zipfile.get_output_stream(File.join('xl','_rels','workbook.xml.rels')) {|f| f.puts(writer.write())}
writer = Writer::WorkbookWriter.new(dirpath,self)
zipfile.get_output_stream(File.join('xl','workbook.xml')) {|f| f.puts(writer.write())}
writer = Writer::StylesWriter.new(dirpath,self)
zipfile.get_output_stream(File.join('xl','styles.xml')) {|f| f.puts(writer.write())}
unless @shared_strings.nil?
writer = Writer::SharedStringsWriter.new(dirpath,self)
zipfile.get_output_stream(File.join('xl','sharedStrings.xml')) {|f| f.puts(writer.write())}
end
#preserves external links (exactly, no modification allowed)
unless @external_links.nil?
#-1 because of rels
1.upto(@external_links.size-1) do |i|
zipfile.get_output_stream(
File.join('xl','externalLinks',"externalLink#{i}.xml")) {|f|
f.puts(@external_links[i])
}
end
@external_links['rels'].each_index do |i|
unless @external_links['rels'][i].nil?
zipfile.get_output_stream(
File.join('xl','externalLinks','_rels',"externalLink#{i}.xml.rels")) {|f|
f.puts(@external_links['rels'][i])
}
end
end
end
#preserves drawings (exactly, no modification allowed)
unless @drawings.nil?
1.upto(@drawings.size) do |i|
zipfile.get_output_stream(
File.join('xl','drawings',"vmlDrawing#{i}.vml")) {|f|
f.puts(@drawings[i])
}
end
end
unless @printer_settings.nil?
1.upto(@printer_settings.size) do |i|
zipfile.get_output_stream(
File.join('xl','printerSettings',"printerSettings#{i}.bin")) {|f|
f.puts(@printer_settings[i])
}
end
end
unless @worksheet_rels.nil?
1.upto(@worksheet_rels.size) do |i|
zipfile.get_output_stream(
File.join('xl','worksheets','_rels',"sheet#{i}.xml.rels")) {|f|
f.puts(@worksheet_rels[i])
}
end
end
unless @macros.nil?
zipfile.get_output_stream(File.join('xl','vbaProject.bin')) {|f| f.puts(@macros)}
end
@worksheets.each_with_index do |sheet,i|
writer = Writer::WorksheetWriter.new(dirpath,self,i)
zipfile.get_output_stream(File.join('xl','worksheets',"sheet#{i+1}.xml")) {|f| f.puts(writer.write())}
end
end
FileUtils.cp(zippath,File.join(dirpath,filename+".#{extension}"))
FileUtils.cp(File.join(dirpath,filename+".#{extension}"),filepath)
if File.exist?(filepath)
FileUtils.rm_rf(dirpath)
end
return filepath
end