簡體   English   中英

C#Excel VSTO無法將字符串轉換為String.Array

[英]C# Excel VSTO can not convert string to String.Array

我是VSTO C#excel外接程序的新手。 我正在尋找范圍內非空/空行的總數。 我的代碼查看范圍“ A4:E4”並計算總行數。

這是代碼:

private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            Workbook workbook =  Globals.ThisAddIn.GetWorkBook("c:\\temp\\testfile.xlsx");
            Worksheet mergeSheet = workbook.Worksheets["Data"];
            Excel.Range mergeCells = mergeSheet.Range["A4:E4"];
            var colValues = (System.Array)mergeCells.Columns[1].Cells.Value;
            var strArray = colValues.OfType<object>().Select(o => o.ToString()).ToArray();
            var rowCount = strArray.Length;
        }

 [public Excel.Workbook GetWorkBook(string pathName)
        {
            return (Excel.Workbook)Application.Workbooks.Open(pathName);
        }][1]

我收到錯誤var colValues = (System.Array)mergeCells.Columns[1].Cells.Value; 在線:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Cannot convert type 'string' to 'System.Array''

當我在范圍內有兩行時,它可以工作。 我已經硬編碼范圍A4:E4來產生錯誤。 我的Excel工作表(testfile.xlsx)如下所示:

在此處輸入圖片說明

有什么想法我該如何解決?

當我有兩行時,同一行代碼有效。 例如,下一行已更新

Excel.Range mergeCells = mergeSheet.Range["A4:E5"];

在此處輸入圖片說明

這行給我帶來麻煩, var colValues = (System.Array)mergeCells.Columns[1].Cells.Value

該行只有一個值。 請注意,當mergeCells范圍包含兩行時,同一行有效。

為什么它不適用於單個單元格范圍:

Value的單電池的不是一個數組(它是一個長整型,字符串,日期時間等),並且將不被轉換為以這種方式的陣列。 您可以通過如下測試進行查看:

var myArray = (System.Array)"hello"

對於其他類型,這將導致相同的失敗:

在此處輸入圖片說明

為什么適用於多單元范圍:

Value多小區范圍將返回個別單元格值的變型陣列,其或者是,或者可以轉換為一個System.Array

可能會有更好的分辨率,但是至少您應該能夠做到:

var colValues;
if (mergeCells.Columns[1].Cells.Count > 1)
{
    colValues = (System.Array)mergeCells.Columns[1].Cells.Value;
}
else
{
    // NB: you may need to cast other data types to string
    //     or you could use .Cells[0].Text.Split()
    colValues = (System.Array)mergeCells.Columns[1].Cells[0].Value.Split();
}

問題在於Range.Value可以返回不同類型的對象。 除其他外,它可以返回

  • 類型為String的單個值(如果范圍包含一個包含字符串的單個單元格,或者
  • 如果范圍包含多個單元格,則為值的數組。

最簡單的解決方案是計算單元格的數量,並將特殊的“單值”情況“包裝”在數組中:

var range = mergeCells.Columns[1].Cells;
var values = (range.Count == 1)
    ? new object[] { range.Value })
    : ((Sytem.Array)range.Value).Cast<object>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM