使用安全电子表格在xlsx中添加密码

如何解决使用安全电子表格在xlsx中添加密码

我尝试在我的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文件的密码

解决方法

进入图书馆,documentation我找到了答案。

保护现有的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

,

根据我对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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?