0

ac# コンソール アプリケーション内で NPOI ライブラリを使用して、Excel に情報を書き込んでいます。私が直面しているように見える問題は、コードが for ループ内から実行されないことです (同じコードを for ループから取り出すと、機能してスプレッドシートが更新されます)。

コードをステップ実行したので、ループでcreateRow、SetCellValueなどにヒットすることがわかっているので、ループの問題ではないことを知っています。ループでそれを実行したくないようです。面白いことに、ほとんど同じコード (C# ではなく VB.Net) が動作しますか?

サンプル C# コード

        using (var fs = new FileStream(templateName, FileMode.Open, FileAccess.Read))
        {
            var template = new HSSFWorkbook(fs, true);
            var sheet = template.GetSheet(sheetName);
            int rowCount = 1;
            int colCount = 0;

            colCount = 0;

            NPOI.SS.UserModel.Row rowIn = null;
            NPOI.SS.UserModel.Cell cellIn = null;

            //foreach (var item in items)
            for(int i = 0; i < items.Count; i++)
            {
                rowIn = sheet.CreateRow(i);
                cellIn = rowIn.CreateCell(1);
                cellIn.SetCellValue("A");
            }

//....rest of the code to save the file 
      }

次の VB.Net コードは動作します。動作するかどうかを確認するために変更しようとした C# コードとは異なりますが、以前は 2 つが単なる標準ポートでした。

Using fs As New FileStream(Server.MapPath("/exporttemplates/tender-export-template.xls"), FileMode.Open, FileAccess.Read)

            Dim templateWorkbook As New HSSFWorkbook(fs, True)
            Dim sheet As HSSFSheet = templateWorkbook.GetSheet("Products")

            Dim productsBids As List(Of TenderProductBid) = TenderProductBid.GetTenderProductBids(tbid.id)
            Dim i As Integer = 1

            For Each pb As TenderProductBid In productsBids

                Dim rowIn As NPOI.SS.UserModel.Row = sheet.CreateRow(i)
                rowIn.CreateCell(0).SetCellValue(pb.product.productName)
                rowIn.CreateCell(1).SetCellValue(pb.quantity)
                rowIn.CreateCell(2).SetCellValue(pb.bid)

                i += 1
            Next

'....rest of the code to save the file 
End Using

ドキュメンテーションは明確ではないため、ループの外側では機能するが、ループ内では機能しないというコードの正確な問題を理解することは明確ではありません。ループが機能していて、情報が渡されている場合は?

4

3 に答える 3

0

上記のコードで何をしているのかわかりません。c#の例で「items」という変数を使用していますが、どこにも宣言されていません。

これは、列Aの値でいっぱいの「sheet1」というワークシートを使用してXLSファイルを読み取る方法の基本的な例です。

    FileStream fs = new FileStream(templateName, FileMode.Open, FileAccess.Read);
    HSSFWorkbook workbook = new HSSFWorkbook(fs);
    Sheet sheet1 = workbook.GetSheet("Sheet1");

    List<string> items = new List<string>();

    for (int i = 1; i <= sheet1.LastRowNum; i++)
    {
        string item = sheet1.GetRow(i).GetCell(0).ToString();
        items.Add(item);
    }

ストリームを適切に破棄するようにしてください(UsingまたはTryCatchFinally)。

于 2012-06-14T16:22:05.880 に答える
0

ループのどこかに問題があるようです。ブレークポイントがヒットし、値が存在する場所がわからないため、何らかの理由でライブラリが foreach を好まないようです。

于 2012-06-14T16:00:06.233 に答える
0

FileAccess モードを「FileAccess.ReadWrite」に変更してみてください

于 2013-01-30T05:44:14.733 に答える