请帮帮我! // ERROR 100

Excel.PivotFieldNewMeasure=culatedFields.Add("NewMeasure",FORMULA,TRUE);

AddMeasure(task.attachment.FullName, 
    WorkSheetIndex: GetWorksheetIndex(task, "Promo Voice total"), 
    pivotTableName: "pt1", 
    MeasuresName: "myesures", 
    formula: "=A1+B1");

public static void AddMeasure(string file, int WorkSheetIndex, string pivotTableName, string MeasuresName, string formula)
{
    Excel.Application excelApp = new Excel.Application();

    try
    {
        Excel.Workbook workbook = excelApp.Workbooks.Open(file);
        Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[WorkSheetIndex];

        Excel.PivotTable pivotTable = worksheet.PivotTables(pivotTableName) as Excel.PivotTable;

        if (pivotTable != null)
        {
            Excel.CalculatedFields calculatedFields = pivotTable.CalculatedFields();
            if (calculatedFields != null)
            {
                Excel.PivotFieldNewMeasure=culatedFields.Add("NewMeasure",FORMULA,TRUE);**// HERE ERROR `System.Runtime.InteropServices.COMException: '0x800A03EC'`**

                ((Excel.PivotField)pivotTable.PivotFields($"{MeasuresName}")).Orientation = Excel.XlPivotFieldOrientation.xlDataField;

                if (newMeasure != null)
                {
                    pivotTable.AddDataField(newMeasure);
                    Console.WriteLine($"Measure '{MeasuresName}' added successfully.");
                }}}
        workbook.Save();
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
    finally
    {
        excelApp.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
    }
}

// ERROR 100

Excel.PivotFieldNewMeasure=culatedFields.Add("NewMeasure",FORMULA,TRUE);

推荐答案


VB.NET

我很快就用VB.net写了这段代码.它的工作方式与预期一致.当天晚些时候,如果我有时间,我会用C #代码更新帖子,如果你仍然卡住了…

Before:

enter image description here

Code:

Imports Excel = Microsoft.Office.Interop.Excel

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim xlApp As New Excel.Application
        Dim xlWb As Excel.Workbook
        Dim Mdl As Excel.Model
        Dim tbl As Excel.ModelTable

        With xlApp
            .Visible = True

            '~~> Open workbook
            xlWb = .Workbooks.Open("C:\Users\routs\Downloads\Test.xlsm")

            Mdl = xlWb.Model
            tbl = Mdl.ModelTables("Range")

            '~~> Delete the measure if it already exists
            Try
                Mdl.ModelMeasures("NewMeasure").Delete
            Catch ex As Exception
            End Try

            Try
                Mdl.ModelMeasures.Add("NewMeasure", tbl, "1+2", Mdl.ModelFormatDecimalNumber(False, 2))
            Catch ex As Exception
                MessageBox.Show(ex.Message, "System Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End With

        '~~> Save and Close workbook and quit Excel
        xlWb.Close(True)
        xlApp.Quit()

        '~~> Flush the toilet
        Kawoosh(tbl)
        Kawoosh(xlWb)
        Kawoosh(Mdl)
        Kawoosh(xlApp)
    End Sub

    Private Sub Kawoosh(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
End Class

Output

enter image description here


C #

在VB.Net中,默认情况下关闭Option Strict,因此它允许隐式数据类型转换.如果您将我上面给出的代码直接转换为C #,它将在如下所示的行上出错.我相信这就是你得到的错误...

enter image description here

在VB.net中,当您在项目上单击鼠标右键并 Select "属性"时,您会看到Compile标签(如下所示),您可以在其中调整Option Strict属性.

enter image description here

C #中缺少此选项卡(如下所示).

enter image description here

C #中不存在此设置,因为就像我上面提到的那样,C #中不允许隐式数据类型转换.

那么,我们该如何解决这个问题呢?我们使用关键字dynamic.该关键字提供了与C #等价的Option Struction功能.

试试这个代码.我已经测试过了.它起作用了.

using System;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Excel.Application xlApp = new Excel.Application();
            Excel.Workbook xlWb;
            // Excel.Model Mdl;
            Excel.ModelTable tbl;

            {
                xlApp.Visible = true;

                // ~~> Open workbook
                xlWb = xlApp.Workbooks.Open(@"C:\Users\routs\Downloads\Test.xlsm");

                dynamic Mdl = xlWb.Model;

                tbl = Mdl.ModelTables["Range"];

                try
                {
                    Mdl.ModelMeasures["NewMeasure"].Delete();
                }
                catch (Exception ex)
                {
                }

                try
                {
                    Mdl.ModelMeasures.Add("NewMeasure", tbl, "1+2", Mdl.ModelFormatDecimalNumber(false, 2));
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "System Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            // ~~> Close workbook and quit Excel
            xlWb.Close(true);
            xlApp.Quit();

            // ~~> Flush the toilet
            Kawoosh(tbl);
            Kawoosh(xlWb);
            Kawoosh(xlApp);
        }
        private void Kawoosh(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
            }
            finally
            {
                GC.Collect();
            }
        }
    }
}

Csharp相关问答推荐

IComponition.获取IReadOnlyCollection的返回默认属性值

如何在Visual Studio中为C# spread操作符设置格式规则?

ASP.NET MVC中创建视图的过滤器

从Blob存储中提取tar.gz文件并将提取结果上载到另一个Blob存储

如何在页面重新加载后保持菜单切换状态

在使用Audit.NET的AuditTrail实现中,如何逐月将数据摄取到AzureTableStorage?

GODOT 4向C#中的字符串参数发送信号以等待

VS 2022与VS 2019:如何/为什么创建额外的任务?

如何实现有条件的自定义Json转换器隐藏属性

获取混淆&Quot;模糊引用&Quot;错误

在C#中,当输入一个方法/局部函数时,我的IEnumerator被重置/重新创建.为什么?

删除MudRadio时,MudRadioGroup未 Select 正确的MudRadio

使DefaultIfEmpty返回空

如何在Cake脚本中设置MSBuild.exe的绝对路径

游戏对象走向不同的方向

如何更改Datagridview行标题

实例化列表时的集合表达式是什么?

如何在.NET8中使用Blazor Web App(WebAssembly)托管服务器端控制器?

默认架构不存在EF核心迁移

是否在异步方法中避免Span<;T>;.ToArray()?