C# 在Excel C中编写对象的二维数组

C# 在Excel C中编写对象的二维数组,c#,multidimensional-array,user-defined-functions,excel-dna,C#,Multidimensional Array,User Defined Functions,Excel Dna,我使用c,excelDna外接程序在excel中创建了一个新的用户定义函数,我想得到的是当用户打开excel文件,在单元格上单击clic并写入=myFunction按enter键时,数据应该显示在excel文件中。这些数据是从sql server数据库中检索的,存储在对象的2D数组中,我的问题是,当我尝试在excel范围中显示此数组时,出现了此异常 HRESULT异常:0x800A03EC 下面是我的代码: public static void LoadViewData() {

我使用c,excelDna外接程序在excel中创建了一个新的用户定义函数,我想得到的是当用户打开excel文件,在单元格上单击clic并写入=myFunction按enter键时,数据应该显示在excel文件中。这些数据是从sql server数据库中检索的,存储在对象的2D数组中,我的问题是,当我尝试在excel范围中显示此数组时,出现了此异常 HRESULT异常:0x800A03EC 下面是我的代码:

public static void LoadViewData()
  {
      var target = (ExcelReference)XlCall.Excel(XlCall.xlfCaller);
      var sheetName = (string)XlCall.Excel(XlCall.xlSheetNm, target);
      var application = (Microsoft.Office.Interop.Excel.Application)ExcelDnaUtil.Application;
      var sheet = application.Sheets[Regex.Replace(sheetName, @"\[[^]]*\]", string.Empty)];
      object[,] result = LoadFromDbData();
      var startCell =sheet.Cells[target.RowFirst + 1, target.ColumnFirst];
      var endCell =sheet.Cells[target.RowFirst+ result.GetUpperBound(0) - result.GetLowerBound(0) + 1,
          target.ColumnFirst+ result.GetUpperBound(1) - result.GetLowerBound(1) + 1];
      var writeRange = sheet.Range[startCell, endCell];

      writeRange.Value2 = result;

  }
目标返回用户编写公式=myFunction的单元格的正确值 sheetName返回用户在其中写入公式的正确activeSheet 结果包含从sql server检索的数据,它是一个对象数组[854,8] startcell和endcell表示从哪个单元格到哪个单元格数据将被显示的范围 调试时,所有变量都包含正确的值,此指令中会出现异常:

writeRange.Value2 = result;
有人已经做过这个或者可以帮忙吗?
谢谢

我想您的LoadFromDbData正在返回键入的数据。尝试将每个值转换为字符串。这是一个示例,如果不转换为字符串,我可以重新创建该错误代码:

void Main()
{
  var tbl = new System.Data.DataTable();
  new SqlDataAdapter(@"
  WITH  tally ( OrderNo, UniqueId, RandNumber )
        AS (
             SELECT TOP 50000
                    ROW_NUMBER() OVER ( ORDER BY t1.object_id ), 
                    NEWID(),
                    CAST(CAST(CAST(NEWID() AS VARBINARY(4)) AS INT) AS DECIMAL) / 1000
             FROM   master.sys.all_columns t1
             CROSS JOIN master.sys.all_columns t2
           )
  SELECT  OrderNo, 
    DATEADD(DAY, -OrderNo, GETDATE()) as OrnekDate, 
    UniqueId, RandNumber, 
    abs(RandNumber)%100 / 100 as pct
  FROM [tally];", @"server=.\SQLExpress;Database=master;Trusted_Connection=yes;").Fill(tbl);

  object[,] arr = new object[tbl.Rows.Count + 1, tbl.Columns.Count];
  for (int i = 0; i < tbl.Columns.Count; i++)
  {
    arr[0, i] = tbl.Columns[i].Caption;
  }
  for (int i = 0; i < tbl.Rows.Count; i++)
  {
    for (int j = 0; j < tbl.Columns.Count; j++)
    {
      arr[i + 1, j] = tbl.Rows[i][j].ToString(); // without .ToString() you should have the error
    }
  }

  // Excel dosya yarat ve arrayi koy
  Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application();
  var workbook = xl.Workbooks.Add();
  xl.Visible = true;

 Worksheet sht = ((Worksheet)workbook.ActiveSheet);
 Range target = (Range)sht.Range[ (Range)sht.Cells[1,1], (Range)sht.Cells[arr.GetUpperBound(0)+1,arr.GetUpperBound(1)+1] ];
 target.Value2 = arr;

}
注意:作为旁注,为什么要将数据传输为二维数组?这是其中一种方法,但要注意它是有限的,我不知道上限的值是多少-尝试一个高的数字,比如200K行。
最好通过查询表将数据输入excel。将记录集添加或复制到我的体验中。根据需要,您还可以直接将Excel文件本身用作数据表并进行插入。Nuget上也有EPPlus库,但速度会有点慢,而且可能不包含您需要的所有功能

看起来您正试图从用户定义的函数(从工作表公式调用)修改Excel工作表。Excel不允许此范围。值=。。。在UDF函数中调用时将始终失败。您需要从功能区按钮或其他地方运行代码。在这种情况下,您必须从使用调用者改为使用ActiveCell来决定更新的位置。