在Excel C#范围内写入二维对象数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Excel C#范围内写入二维对象数组相关的知识,希望对你有一定的参考价值。
我使用c#,excelDna插件在excel中创建了一个新的用户定义函数,我想得到的是当用户打开一个excel文件,clic在一个单元格上并且写入= myFunction()按回车时,数据应显示在excel文件。这些数据是从sql server数据库中检索出来并存放在2D数组中的对象,我的问题是当我尝试在excel范围内显示这个数组时我得到了这个异常Exception de 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;
}
target返回用户编写公式的单元格的正确值(= 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;
}
注意:作为旁注,为什么要将数据作为2D数组传输?这是方法之一,但要注意它是有限的(我不知道上限的好价值 - 尝试像200K行的高数字)。根据我的经验,最好通过QueryTables.Add或CopyFromRecordSet将数据导入excel。根据您的需要,您也可以直接将Excel文件本身用作数据表并进行插入。 Nuget上还有EPPlus库,但这有点慢+可能不包含你需要的所有功能。
以上是关于在Excel C#范围内写入二维对象数组的主要内容,如果未能解决你的问题,请参考以下文章