1

Excel シートの個々のセルのプロパティを取得できないようです。私が持っている関数は、Excel ワークシートを作成し、DataSet からのデータを入力して、シートを印刷します。

私が抱えている問題は、シートを印刷すると、書式設定がすべてうまくいかないことです。セルが小さすぎて、多くの情報が切り捨てられます。セルの幅を設定してフォントを変更するにはどうすればよいですか?

あなたの熟読のために、ここに私が取り組んでいるものの小さなスニペットがあります:

// Add rows
iRow = 1;

foreach (DataRow row in table.Rows)
{
    iCol = 1;

    foreach (DataColumn col in table.Columns)
    {
        Parameters = new Object[2];
        Parameters[0] = iRow + 1;
        Parameters[1] = iCol;
        excelCell = excelSheet.GetType().InvokeMember("Cells",
          BindingFlags.GetProperty, null, excelSheet, Parameters);

        Parameters = new Object[1];
        Parameters[0] = row[col.ColumnName];
        excelCell.GetType().InvokeMember("Value",
          BindingFlags.SetProperty, null, excelCell, Parameters);

        iCol++;
    }
    iRow++;
}

早期バインディングで同様のことを達成する方法の例はたくさんあるようですが、遅延バインディングで何かが欠けているに違いありません。

4

3 に答える 3

1

Siddharth が私に示したものを使用して、ワークシートからセル範囲を取得し、その範囲の ColumnWidth プロパティを変更することができました。

//Get the first worksheet.
Parameters = new Object[1];
Parameters[0] = 1;
excelSheet = excelSheets.GetType().InvokeMember("Item",
    BindingFlags.GetProperty, null, excelSheets, Parameters);

//Set the Column Width within a large Range of cells.
Parameters = new Object[2];
Parameters[0] = "A1";
Parameters[1] = "E55";
excelRange = excelSheet.GetType().InvokeMember("Range",
    BindingFlags.GetProperty, null, excelSheet, Parameters);

Parameters = new Object[1];
Parameters[0] = 26;
excelRange.GetType().InvokeMember("ColumnWidth",
BindingFlags.SetProperty, null, excelRange, Parameters);

このメソッドを使用して、「ColumnWidth」を設定したいプロパティに置き換えることで、その範囲内の任意のセル プロパティを変更できます。


フォントを変更するには、最初にセルの Font プロパティをオブジェクトとして取得し、そのオブジェクトを使用してフォント プロパティにアクセスする必要がありました。

object cellFont = excelCell.GetType().InvokeMember("Font",
    BindingFlags.GetProperty, null, excelCell, null);

Parameters = new Object[1];
Parameters[0] = true;
cellFont.GetType().InvokeMember("Bold",
BindingFlags.SetProperty, null, cellFont, Parameters);

ありがとう!

于 2012-07-06T13:47:55.923 に答える
1

セルの幅を変更することは、列の幅を変更することと同じです

これが役立つかどうかを確認しますか?(未テスト)

// Set the column width
public void SetColWdth(string rng, double wdth)
{
    Range = excelSheet.GetType().InvokeMember("Range",
    BindingFlags.GetProperty,null, excelSheet, new object [] {rng});
    object [] args = new object [] {wdth};
    Range. GetType().InvokeMember ("Columnwdth",
    BindingFlags.SetProperty, null, Range, args);
}

フォントについては、これが役立つかどうかを確認してください。

それが死ぬ場合に備えて、上記のリンクからの引用

foreach (string line in header)
{

    Object entireRow = GetRow(sheet, columnCount, rowOffset);
    entireRow.GetType().InvokeMember("MergeCells",
    BindingFlags.SetProperty, null, entireRow,
    new object[] { true });
    entireRow.GetType().InvokeMember("HorizontalAlignment",
    BindingFlags.SetProperty, null, entireRow, new object[] { 3 });
    Object tlCell = GetCell(sheet, 1, rowOffset);
    tlCell.GetType().InvokeMember("Value2", BindingFlags.SetProperty,
    null, tlCell, new object[] { "'" + line });
    Object font = tlCell.GetType().InvokeMember("Font",
    BindingFlags.GetProperty, null, tlCell, null);

    rowOffset++;
}

for (int col = 0; col < data.Columns.Count; col++)
{
    Object test = GetCell(sheet, col + 1, rowOffset);
    //DataTable Headers
    {
        Object erow = test.GetType().InvokeMember("EntireRow",
        BindingFlags.GetProperty, null, test, null);
        Object font = erow.GetType().InvokeMember("Font",
        BindingFlags.GetProperty, null, erow, null);
        erow.GetType().InvokeMember("HorizontalAlignment",
        BindingFlags.SetProperty, null, erow, new object[] { 3 });
        font.GetType().InvokeMember("Bold", BindingFlags.SetProperty,
        null, font, new object[] { true });
        test.GetType().InvokeMember("Value2", BindingFlags.SetProperty,
        null, test, new object[] { data.Columns[col].ColumnName.ToString() });
    }
}
于 2012-07-05T22:34:44.320 に答える