设想

设想

设想

在尝试从.ods可读取和编辑且不需要任何密码但包含一些数据验证单元的文件中读取单元格时,我遇到了一些技术困难。

我可以使用 LibreOffice 版本:6.3.2.2 (x64) 手动打开 .ods,无需输入密码,并将其保存为文件.xlxs。然后我可以.xlxs使用 vba 在 Excel 2016 中打开该文件。

问题

然而我想知道我该如何做:

  • .ods使用excel的方法自动读取“密码保护*”文件中的单元格.vba
  • 或者运行一个脚本,从中.vba创建文件副本.ods并将其转换为.xlxs

相关错误信息:

运行时错误“1004”:无法打开“.ods”:该文件已受密码保护,无法打开。

VBA 代码:

' Initialize variables
planningWorkbookName = "PlanningData-Form-Temp.ods"
currentPath = ThisWorkbook.path
parentPath = getParentFolder2(currentPath) + "/" + planningWorkbookName
MsgBox (parentPath)
Set planWB = Workbooks.Open(parentPath)

答案1

这个答案是不完整的,因为它要求启动一个 python 脚本,而不是问题所要求的 vba 脚本。但是,它确实执行了应该执行的 vba 方法。所以问题是起点是 python 而不是 vba,因为我还不能以在大多数平台上工作的方式从 vba 运行 python。

  • 第一个函数将.ods文件转换为.xlsx文件(都位于脚本的父文件夹中convert.py)。
  • 第二个函数执行 vba 代码(然后读取新创建的.xlxs文件的内容)。
# prerequisites: requires python 3.x (or higher)
# open cmd
# browse to this directory
# install pyexcel with:
# python -m pip install pyexcel
# python -m pip install pyexcel-ods (outdated)
# python -m pip install pyexcel-ods3 (outdated)
# python -m pip install pyexcel-xlsx
# python -m pip install pyexcel-xlsxw (ignored)
# run this script with:
# python convertOds.py
import pyexcel
import glob
import os


def convert_to_xlxs():
    os.chdir(".")
    for file in glob.glob("../*.ods"):
        #for sheet in file:
         #   print(sheet)
        #sheet = pyexcel.get_sheet(file_name = file)
        sheet = pyexcel.get_sheet(file_name = file,sheet_name = "Course")
        sheet += pyexcel.get_sheet(file_name = file,sheet_name = "Lectures")
        sheet += pyexcel.get_sheet(file_name = file,sheet_name = "Assignments")
        sheet += pyexcel.get_sheet(file_name = file,sheet_name = "OldExams")
        sheet += pyexcel.get_sheet(file_name = file,sheet_name = "Exercises")
        sheet += pyexcel.get_sheet(file_name = file,sheet_name = "StudyMaterial")
        sheet += pyexcel.get_sheet(file_name = file,sheet_name = "Exam")

        #print(sheet)
        sheet.save_as(file + '.xlsx')

def run_excel_module_from_python():
    import os, os.path
    import win32com.client

    if os.path.exists("GenerateTwCommandsAndLatexTemplates.xlsm"):
        xl=win32com.client.Dispatch("Excel.Application")
        xl.Workbooks.Open(os.path.abspath("GenerateTwCommandsAndLatexTemplates.xlsm"), ReadOnly=1)
        xl.Application.Run("GenerateTwCommandsAndLatexTemplates.xlsm!Module1.main")
        ##    xl.Application.Save() # if you want to save then uncomment this line and change delete the ", ReadOnly=1" part from the open function.
        xl.Application.Quit() # Comment this out if your excel script closes
        del xl

convert_to_xlxs()
print("Converted .ods to .xlxs in parentfolder.")
run_excel_module_from_python()
print("Completed evaluation of excel subroutine")

相关内容