【问题标题】:Is there a way to programmatically insert formulas into a csv file using vb.net?有没有办法使用 vb.net 以编程方式将公式插入 csv 文件?
【发布时间】:2013-06-11 15:42:56
【问题描述】:

我需要将公式添加到已存在的 CSV 文件中。使用 VB.Net 可以做到这一点吗?

我的想法是我已经有一个 CSV 文件,我需要在每个单元格中使用自定义公式填充一列。这必须以编程方式完成,因为这些文件是动态创建的。

有人知道怎么做吗?谢谢。

【问题讨论】:

  • 只需使用“=...”符号中的公式数字,Libreoffice 就会很高兴地应用它们

标签: vb.net csv


【解决方案1】:

1,2,3,=SUM(A1:C1)

当我尝试它时让我感到惊讶,但 Excel 会保留公式。

您甚至可以通过首先在屏幕上显示公式将公式导出为 CSV。 (Ctrl-`)

【讨论】:

    【解决方案2】:

    虽然我坚持认为我的原始答案在技术上是正确的,但我在这方面得到了很多反对意见。显然流行的电子表格软件,如 Microsoft Excel、Open Office、Libre Office Calc 将计算输入到 CSV 文件中的公式。但是,我仍然不建议依赖此功能。

    原答案:
    CSV 格式不支持公式。它是纯文本格式。

    【讨论】:

    • 我不知道这一点,因为我不使用 CSV 文件。如果我把它放在 Excel 文件中,插入公式的过程是什么?
    • .NET 中没有内置任何东西可以让您直接创建/更新 Excel 文件。您可以使用 Jet OLE DB Provider 和 ADO.NET,或第三方 Excel 库。
    【解决方案3】:

    您可以使用逗号分隔值通过文本文件将公式导入 Excel。请记住确保它以 .txt 后缀命名。

    然后进行导入。

    我的示例导入(数据表,来自文本)

    Column1,Column2,ResultColumn

    1,2,=A2+B2

    它导入并计算得很好

    【讨论】:

    • 看起来 OP 需要以编程方式完成此操作,而这似乎更像是手动操作。
    • Sam,就我而言,我使用 perl 生成了相当广泛的电子表格(输出为逗号分隔格式)。甚至这些公式也是从我的程序中生成的。从已经是 csv 的任意系统导入数据并添加到其中似乎是一个简单的过程。但我没有足够的细节来确定提出问题的人到底发生了什么。
    • 这非常有用,也适用于 libreoffice。我发现这也有效:4,3,2,=SUM(A2:C2).
    【解决方案4】:

    在 Excel 中,要导入带逗号的公式,公式必须用双引号括起来,以防止公式跨单元格传播。例如:

    2,4,6,13,=sum(A1:C1),"=if(A1=C1,D1-A1,D1+A1)"

    Excel 的另一个怪癖是,如果您有一个完全由数字组成的字符串,则必须将其呈现为公式以保留前导零。 "00012345" 导入为 12345,忽略引号。要以文本形式导入,.CSV 文件必须将其显示为 ="00012345"。

    【讨论】:

      【解决方案5】:

      您是否正在生成 CSV 文件?如果是这样,请考虑编写一个实际的 Excel 文件。 (我假设您正在导入 Excel,因为您使用了“单元格”一词,这在 CSV 中没有任何意义。)

      这里有一个链接:Create Excel (.XLS and .XLSX) file from C#

      如果您不生成 CSV,并且您只想添加一个新的计算值(而不是一个会随着单元格更改值而动态更改的公式),您可以通过阅读CSV 文件,解析每一行以获得公式所需的值,计算结果,并将其(在逗号后)附加到每一行,然后再将行写入新文件。

      【讨论】:

        【解决方案6】:

        您可以在 Excel 中打开 csv,然后将公式添加到 Excel 并保存回 csv。您可以使用 Microsoft Excel 11.0 对象库来执行此操作。那么

        dim wb as Excel.Workbook
        dim exApp as New Excel.Application
        dim exSheet as Excel.Worksheet
        dim rowNum as integer = 1
        
        wb = System.Runtime.InteropServices.Marshal.BindToMoniker(pathAndFileNameOfCSV)
        exApp = wb.Parent
        
        exApp.DisplayAlerts = False
        exApp.AlertBeforeOverwriting = False
        
        exSheet = exApp.ActiveWorkbook.Sheets.Item(1)
        
        'do your functions in a loop here i.e.
        exSheet.Range("A" & rowNum).Value = "=SUM($A$1:$D$4)"
        rowNum += 1
        
        wb.Close (True) 'closes and saves
        

        保存工作簿时应将公式转换回关闭时的值。

        【讨论】:

          猜你喜欢
          • 2022-11-20
          • 2010-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多