web-dev-qa-db-ja.com

NPOIを使用して新しい.xlsxファイルを作成して書き込みをしようとしています

編集:

Excelスプレッドシートから行を読み取り、行を解析し、フィールド化されたデータを新しいExcelファイルに書き込む小さなコンソールアプリケーションを作成しようとしています。 .NETとNPOIライブラリを使用しています。私はついに掘り下げた後、ApacheサイトでPOIのドキュメントJavaのドキュメントを見つけました。ここに新しいエラーを含む私の更新されたコードがあります。

これは実際に読み取り可能なファイルを作成しますが、3番目の列にのみテキストを書き込みます。

    public static void TransferXLToTable()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("City", typeof(string));
        dt.Columns.Add("State", typeof(string));
        dt.Columns.Add("Zip", typeof(string));

        using (FileStream stream = new FileStream(OpenFile(), FileMode.Open, FileAccess.Read))
        {
            IWorkbook wb = new XSSFWorkbook(stream);
            ISheet sheet = wb.GetSheet("Sheet1");
            string holder;
            int i = 0;
            do
            {
                DataRow dr = dt.NewRow();
                IRow row = sheet.GetRow(i);
                try
                {
                    holder = row.GetCell(0, MissingCellPolicy.CREATE_NULL_AS_BLANK).ToString();
                }
                catch (Exception)
                {
                    break;
                }

                string city = holder.Substring(0, holder.IndexOf(','));
                string state = holder.Substring(holder.IndexOf(',') + 2, 2);
                string Zip = holder.Substring(holder.IndexOf(',') + 5, 5);
                dr[0] = city;
                dr[1] = state;
                dr[2] = Zip;
                dt.Rows.Add(dr);
                i++;
            } while (!String.IsNullOrEmpty(holder));
        }

        using (FileStream stream = new FileStream(@"C:\Working\FieldedAddresses.xlsx", FileMode.Create, FileAccess.Write))
        {
            IWorkbook wb = new XSSFWorkbook();
            ISheet sheet = wb.CreateSheet("Sheet1");
            ICreationHelper cH = wb.GetCreationHelper();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    IRow row = sheet.CreateRow(i);
                    ICell cell = row.CreateCell(j);
                    cell.SetCellValue(cH.CreateRichTextString(dt.Rows[i].ItemArray[j].ToString()));
                }
            }
            wb.Write(stream);
        }
    }
15
Adam

何が間違っていたのかがわかりました。それは実際には非常に単純な間違いでした。外側のループに行を作成する必要があるときに、最も内側のforループに新しい行を作成していました。うまくいけば、答えの作業コードがNPOIの出発点を必要とするすべての人に役立つことを願っています。

このWebサイトは、POIまたはNPOIで始める人にとって素晴らしいリソースです。

http://poi.Apache.org/spreadsheet/quick-guide.html#NewWorkbook

これが作業コードです。

    public static void TransferXLToTable()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("City", typeof(string));
        dt.Columns.Add("State", typeof(string));
        dt.Columns.Add("Zip", typeof(string));

        using (FileStream stream = new FileStream(OpenFile(), FileMode.Open, FileAccess.Read))
        {
            IWorkbook wb = new XSSFWorkbook(stream);
            ISheet sheet = wb.GetSheet("Sheet1");
            string holder;
            int i = 0;
            do
            {
                DataRow dr = dt.NewRow();
                IRow row = sheet.GetRow(i);
                try
                {
                    holder = row.GetCell(0, MissingCellPolicy.CREATE_NULL_AS_BLANK).ToString();
                }
                catch (Exception)
                {
                    break;
                }

                string city = holder.Substring(0, holder.IndexOf(','));
                string state = holder.Substring(holder.IndexOf(',') + 2, 2);
                string Zip = holder.Substring(holder.IndexOf(',') + 5, 5);
                dr[0] = city;
                dr[1] = state;
                dr[2] = Zip;
                dt.Rows.Add(dr);
                i++;
            } while (!String.IsNullOrEmpty(holder));
        }

        using (FileStream stream = new FileStream(@"C:\Working\FieldedAddresses.xlsx", FileMode.Create, FileAccess.Write))
        {
            IWorkbook wb = new XSSFWorkbook();
            ISheet sheet = wb.CreateSheet("Sheet1");
            ICreationHelper cH = wb.GetCreationHelper();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                IRow row = sheet.CreateRow(i);
                for (int j = 0; j < 3; j++)
                {
                    ICell cell = row.CreateCell(j);
                    cell.SetCellValue(cH.CreateRichTextString(dt.Rows[i].ItemArray[j].ToString()));
                }
            }
            wb.Write(stream);
        }
    }
24
Adam