使用安全电子表格在 xlsx 中添加密码
Add password in xlsx using secure-spreadsheet
我尝试将密码放入我的 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
以上代码将在浏览器中下载。
这是问题的来源
这是我使用的回购
https://github.com/randym/axlsx
https://github.com/ankane/secure-spreadsheet
我没有使用电子表格保护。我不需要那个,因为它只会锁定电子表格。我需要的是整个 excel 文件的密码
根据我对 axlsx 的理解,目前无法用密码保护电子表格的打开。
作为变通方法,我将生成的电子表格放入受密码保护的 zip 文件中并下载了它。
这需要rubyZip 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
深入图书馆 documentation 我找到了答案。
Protect an existing 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
我尝试将密码放入我的 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
以上代码将在浏览器中下载。
这是问题的来源
这是我使用的回购
https://github.com/randym/axlsx
https://github.com/ankane/secure-spreadsheet
我没有使用电子表格保护。我不需要那个,因为它只会锁定电子表格。我需要的是整个 excel 文件的密码
根据我对 axlsx 的理解,目前无法用密码保护电子表格的打开。
作为变通方法,我将生成的电子表格放入受密码保护的 zip 文件中并下载了它。
这需要rubyZip 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
深入图书馆 documentation 我找到了答案。
Protect an existing 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