1

我尝试在我的excel文件中输入密码

def excel_file
  

    test = Axlsx::Package.new do |p|

      p.workbook.add_worksheet(:name => "Pie Chart") do |sheet|
        sheet.add_row ["Simple Pie Chart"]
        %w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
        sheet.add_chart(Axlsx::Pie3DChart, :start_at => [0,5], :end_at => [10, 20], :title => "example 3: Pie Chart") do |chart|
          chart.add_series :data => sheet["B2:B4"], :labels => sheet["A2:A4"],  :colors => ['FF0000', '00FF00', '0000FF']
        end
      end
      p.serialize('simple.xlsx')
    end


   IO.popen("secure-spreadsheet --password secret", "r+") do |io|
    io.write(test)
    io.close_write
    io.read
  end

end

在上面的代码中,它将在我的项目文件中生成名为 simple.xlsx 的 excel 文件。然后我想使用安全电子表格输入密码。

代码的“IO.popen”部分是。我不确定我做的是正确的代码。目标是获取创建的 alxsx 文件,然后添加密码。

def download_excel
  respond_to do |format|
    format.xlsx { send_data excel_file, type: 'application/xlsx; header=present', disposition: "attachment", filename: "output.xlsx"  }
  end
end

上面的代码将在浏览器中下载。

这是问题的起源 rails http response to Donwload excel file

这是我正在使用的回购协议

https://github.com/randym/axlsx

https://github.com/ankane/secure-spreadsheet

我没有使用电子表格保护。我不需要那个,因为它只锁定电子表格。我需要的是整个excel文件的密码

4

2 回答 2

3

深入研究图书馆和文档,我找到了答案。

保护现有的 XLSX

cat input.xlsx | secure-spreadsheet --password secret --input-format xlsx > output.xlsx

您提供的代码有什么问题,它没有考虑input-format选项并且File.write(test)实际上将实例写入Axlsx::Package文件,这不是您想要的。你想要那的序列化内容Axlsx::Package

这是解决方案

excel_filename = 'simple.xlsx'
test = Axlsx::Package.new do |p|
  p.workbook.add_worksheet(:name => "Pie Chart") do |sheet|
    sheet.add_row ["Simple Pie Chart"]
    %w(first second third).each { |label| sheet.add_row [label, rand(24)+1] }
    sheet.add_chart(Axlsx::Pie3DChart, :start_at => [0,5], :end_at => [10, 20], :title => "example 3: Pie Chart") do |chart|
      chart.add_series :data => sheet["B2:B4"], :labels => sheet["A2:A4"],  :colors => ['FF0000', '00FF00', '0000FF']
    end
  end

  p.serialize(excel_filename)
end

secured = IO.popen("secure-spreadsheet --password secret --input-format xlsx", "r+") do |io|
  io.write(File.read(excel_filename))
  io.close_write
  io.read
end

my_new_secured_file = File.open('secured_sheet.xlsx', 'w') { |f| f.write(secured) }

secured包含你不安全的文件(simple.xlsx)和一些元数据,告诉excel这个新文件(my_new_secured_file变量)实际上是加密的,需要密码才能打开它

因此您需要将加密数据存储在secured变量中(因为它实际上是由您的内部 shell 调用和修改的),然后将其写入一个新文件,该文件将被保护 xlsx 电子表格

尝试在您的终端中打开

open secured_sheet.xlsx

系统会提示您输入密码secret

于 2020-11-04T15:19:12.430 回答
1

根据我对 axlsx 的理解,目前无法对电子表格的打开进行密码保护。

作为一种解决方法,我将生成的电子表格放在受密码保护的 zip 文件中并下载。

这需要ruby​​Zip gem

下面是采用 Axlsx 包并将其放入 zip 文件流的代码,然后您可以将其下载或保存到文件中。

  def zip_and_protect(package, spreadsheet_filename, password)
    buffer = Zip::OutputStream.write_buffer(::StringIO.new(''), Zip::TraditionalEncrypter.new(password)) do |out|
      out.put_next_entry(spreadsheet_filename)
      out.write package.to_stream.read
    end
    buffer.rewind
    buffer
  end
于 2020-10-28T17:57:34.123 回答