c# - 尝试使用 NPOI 创建一个新的 .xlsx 文件并写入

标签 c# excel npoi

编辑:

我正在尝试编写一个小型控制台应用程序,它将从 excel 电子表格中读取行,解析行并将字段数据写入新的 excel 文件。我正在使用 .NET 和 NPOI 库。经过大量挖掘,我终于在 apache 站点上找到了 POI 的 Java 文档。这是我更新后的代码,其中包含新错误。

这实际上创建了一个可读文件,只是它只将文本写入第三列。

    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);
        }
    }

最佳答案

我想出了问题所在。这实际上是一个非常简单的错误,当我需要在外层循环中创建行时,我在最内层的 for 循环中创建了一个新行。希望答案中的工作代码对需要 NPOI 起点的任何人都有用。

对于开始使用 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);
        }
    }

关于c# - 尝试使用 NPOI 创建一个新的 .xlsx 文件并写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19838743/

相关文章:

c# - 如何从项目文件夹中确定团队项目 URI

c# - 如何创建从其他两个属性获取值的依赖属性

c# - OpenXML SDK - Excel 范围

vba - 如何在网页上输入用户名和密码?

c# - MS Word,使用 NPOI 库

c# - 如何在 Winform DataGridView 中创建不同的单元格格式

c# - VS 2010 无法正常工作并在 Windows 10 中安装 Visual Studio 2010 SP1 更新

excel - 如何在 Pandas 数据框列中插入逗号作为千位分隔符?

c# - 使用 NPOI 密码保护 excel

excel - MVC3 返回文件操作导致间歇性 Excel 程序错误