为 OOO Calc 电子表格中的每一行创建新的 txt/html 文件

Posted

技术标签:

【中文标题】为 OOO Calc 电子表格中的每一行创建新的 txt/html 文件【英文标题】:Create new txt/html file for each row in OOO Calc spreadsheet 【发布时间】:2014-08-02 06:03:30 【问题描述】:

我想从 Calc 电子表格的每一行创建一个新的 txt 文件(实际上是 html 文件)。我从 Excel 电子表格中找到了一些答案,但它们不适用于 Calc。

我没有 Excel。我正在使用 OOO 4。

我在 Calc 中尝试了这个 Excel 宏,但出现错误 - 范围是未知数据类型。研究这似乎表明 Excel 宏在 OOO Calc 中无法正常工作。我发现如果我在选项中启用“可执行代码”,Excel 宏可能会起作用,但这没有帮助。下面的宏假设只有 2 列,我试图让它作为一个起点。

Outputting Excel rows to a series of text files

Sub Export_Files()
Dim sExportFolder, sFN
Dim rArticleName As Range
Dim rDisclaimer As Range
Dim oSh As Worksheet
Dim oFS As Object
Dim oTxt As Object

'sExportFolder = path to the folder you want to export to
'oSh = The sheet where your data is stored
sExportFolder = "C:\Disclaimers"
Set oSh = Sheet1

Set oFS = CreateObject("Scripting.Filesystemobject")

For Each rArticleName In oSh.UsedRange.Columns("A").Cells
    Set rDisclaimer = rArticleName.Offset(, 1)

    'Add .txt to the article name as a file name
    sFN = rArticleName.Value & ".txt"
    Set oTxt = oFS.OpenTextFile(sExportFolder & "\" & sFN, 2, True)
    oTxt.Write rDisclaimer.Value
    oTxt.Close
Next
End Sub

我的工作表有多个列(例如,我们可以说 6)。我想用第 1 列中的值命名每个文件,然后让文件本身包含每个附加列的内容 - 每个都在新行上。理想情况下,这适用于空单元格(只是一个空行),因此我可以根据需要添加新的空行来分隔内容。

工作表有 400 行,所以我希望它最终成为 400 个文件 - 每行一个。

电子表格包含来自 CMS 的博客内容 - 我查询数据库以获取标题、摘要、正文、类别等,并将其放入 Excel 电子表格。因此,给定单元格中的某些内容可能很长并且包含 html。其中还有逗号和制表符,因此是 Excel 电子表格而不是 CSV。

我的目标是使用我可以从中获取的单个文件输入 Jekyll 以重新创建我的博客。我知道 Jekyll 有进口商,但我的 CMS 不是其中之一(DNN/Ventrian)。我没有看到将 Excel 工作表直接导入 jekyll 的方法。

我希望将所有数据导出到文件中 - 它不是某个范围或任何内容,而是整个工作表。

【问题讨论】:

【参考方案1】:

这似乎可行 - 尽管有时会出错,但我认为是因为我用作文件名的值有问题。当我玩它时,我有 i = 1 到 50,改变它控制它的行数。有几个注释掉的 Print 语句有助于查看发生了什么 - 它们只是在一个小弹出窗口中打印到屏幕上。

修改自:https://forum.openoffice.org/en/forum/viewtopic.php?t=34074

  sub saveas2
 Dim oDocOptions(0) as New com.sun.star.beans.PropertyValue

'stores the document objects
Dim oDoc as Object
Dim oSheet as Object
Dim sSavePath as String
Dim sFileName as string
Dim sFullPath as String
Dim sSaveLink as String
Dim oSaveOptions(1) as New com.sun.star.beans.PropertyValue
Dim c as Integer
 for c = 1 to 50

'stores the script doc's open settings


'setup the settings to open the crm script file with
 oDocOptions(0).Name = "Hidden"
 oDocOptions(0).Value = True
 ' print c
 ' print (thisComponent.getSheets.getByName("Query").getCellRangeByName("E" & c).getString)
 'open a blank spreadsheet to build the script with
  oDoc = starDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, oDocOptions())

  'setup the first sheet of the new doc
  oSheet = oDoc.sheets().getByIndex(0)

  'print (thisComponent.getSheets.getByName("Query").getCellRangeByName("E" & c).getString)
   oSheet.getCellRangeByName("A6").String = (thisComponent.getSheets.getByName("Query").getCellRangeByName("A" & c).getString)   
   oSheet.getCellRangeByName("A1").String = (thisComponent.getSheets.getByName("Query").getCellRangeByName("E" & c).getString)
   oSheet.getCellRangeByName("A2").String = (thisComponent.getSheets.getByName("Query").getCellRangeByName("C" & c).getString)
   oSheet.getCellRangeByName("A3").String = (thisComponent.getSheets.getByName("Query").getCellRangeByName("F" & c).getString)
   oSheet.getCellRangeByName("A4").String = (thisComponent.getSheets.getByName("Query").getCellRangeByName("G" & c).getString)

  'rebuild the options to save CRM doc with


  'set the options to save the file
   oSaveOptions(0).Name = "FilterName"
   oSaveOptions(0).Value = "Text - txt - csv (StarCalc)" 'THIS ALLOWS IT TO BE SAVED AS A TXT FILE
   oSaveOptions(1).Name = "FilterOptions"
   oSaveOptions(1).Value = "59,0,11,1," 'THIS IS THE FORMATTING I USED TO ACHIEVE THE NO DELIMITER AND ASCII FORMAT

   'store the save location


    sFileName = (thisComponent.getSheets.getByName("Query").getCellRangeByName("A" & c).getString)
    sSavePath = "j:\test\"
    sFullpath = sSavePath & sFileName & ".html"
    'Print sFullPath

   'build the link of the file to get
    sSaveLink = ConvertToURL(sFullPath)

    'save the CRM script file
  oDoc.storeAsURL(sSaveLink , oSaveOptions())

  'close the CRM script file
   oDoc.Close(True)

   next c
   end sub

【讨论】:

我在开头添加了一个简单的 'for i = 1 to 10' 循环,然后将 'next i' 放在最后,它进行了第一轮(将范围更改为 ("E" & i)例如)但是当它循环时会打开一张空白纸并出错。有点像它在第一个上留下了工作表并且没问题,但是第二次通过它忘记了工作表,然后没有数据可以写入空工作表。有点像它需要回到原来的工作表。 我的初始代码在循环中有 Dim 语句 - 这导致它出错。

以上是关于为 OOO Calc 电子表格中的每一行创建新的 txt/html 文件的主要内容,如果未能解决你的问题,请参考以下文章

打开 Office org Calc(电子表格):64k 行的限制?

如果条件为真,如何循环 LibreOffice Calc 电子表格中的行范围、比较单元格值、设置单元格值和删除行

LibreOffice Calc电子表格中怎么快速输入数据?

如何为表格中的每一行创建一个删除按钮?

将电子表格的行转换为单独的 XML 文件

如何从命令行 Python 脚本将所有工作表保存在 LibreOffice Calc 电子表格中