1

一部の Excel データ (日付、数値、実行前の形式がわからないテキストの混合) の書式設定された値を一連の行として読み取り、すべての空白セルを破棄する必要があります。

入力列で自動調整を行うため、理論的には列の幅が十分になり、これらのセルの表示値が #### になることはありませんが、自動調整は出力データに影響を与えないようです。

int rowCount = allCells.Rows.Count;
int colCount = allCells.Columns.Count;
List<List<string>> nonBlankValues = new List<List<string>>();


//to stop values coming out as series of #### due to column width, resize columns
foreach (Excel.Range col in allCells.Columns)
{
    col.AutoFit();
}
for (int i = 0; i < rowCount; i++)
{
    List<string> row = new List<string>();
    for (int j = 0; j < colCount; j++)
    {
        Excel.Range cellVal = (Excel.Range)allCells.Cells[i + 1, j + 1]; //Excel ranges are 1 indexed not 0 indexed
        string cellText = cellVal.Text.ToString();
        if (cellText != "")
        {
            row.Add(cellText);
        }

    }
    if (row.Count > 0)
    {
        nonBlankValues.Add(row);
    }
}
4

2 に答える 2

0

したがって、列のサイズを手動で変更すると問題が解決するようです...

独自の AutoFit に相当するものを作成することが唯一の方法のようです:(だから私には2つのオプションがあります...

A. より高速な方法は、データを読み取る前にすべての列に一定量を追加し、後でそれを削除することです

    foreach (Excel.Range col in allCells.Columns)
    {
        col.ColumnWidth = (double)col.ColumnWidth + colWidthIncrease;
    }

...ここで質問からループ...

    foreach (Excel.Range col in allCells.Columns)
    {
        col.ColumnWidth = (double)col.ColumnWidth - colWidthIncrease;
    }

B. # のみのエントリに遭遇したときに、これが変化するまで固定量ずつ反復的に増加するフィードバック ループを作成します (ループ カウンタ チェックを使用して終了します)。

for (int i = 0; i < rowCount; i++)
{
    List<string> row = new List<string>();
    for (int j = 0; j < colCount; j++)
    {
        string cellText="";
        int maxLoops = 10;
        int loop = 0;
        bool successfulRead = false;
        while (!successfulRead && loop < maxLoops)
        {
            Excel.Range cellVal = (Excel.Range)allCells.Cells[i + 1, j + 1]; //Excel ranges are 1 indexed not 0 indexed
            cellText = cellVal.Text.ToString();
            if (!Regex.IsMatch(cellText, @"#+"))
            {
                successfulRead = true;
            }
            else
            {
                cellVal.EntireColumn.ColumnWidth = Math.Min((double)cellVal.EntireColumn.ColumnWidth + 5, 255);
            }
            loop++;
        }
        if (cellText != "")
        {
            row.Add(cellText);
        }

    }
    if (row.Count > 0)
    {
        nonBlankValues.Add(row);
    }
}
于 2013-06-20T05:36:09.197 に答える