【问题标题】:How to convert IExcelDataReader Values to string Datatype如何将 IExcelDataReader 值转换为字符串数据类型
【发布时间】:2019-07-31 10:36:24
【问题描述】:

我正在使用下面的代码来读取 Excel 并存储在数据集中。

     public DataSet ReadExcelDataToDataSet(Stream fileStream)
            {
                DataTable dataInExcelSheet = new DataTable();
                IExcelDataReader excelReader = ExcelReaderFactory.CreateReader(fileStream);
                DataSet excelDataSet = excelReader.AsDataSet(new ExcelDataSetConfiguration()
                {
                    UseColumnDataType = false
//Do we have any property here to convert all rows values to string datatype.
                });
                excelReader.Close();
                return excelDataSet;
            }

有什么方法可以将 Excel Sheet 的所有值转换为字符串,并作为字符串值存储在 Dataset 中。

示例:

在 Excel 文件中,对于少数列,我的值为 1,22.0,它们属于 Int32 和 Double 数据类型。我想将这些值转换为字符串,然后将它们作为字符串存储在数据集中。

【问题讨论】:

    标签: c# .net .net-core exceldatareader


    【解决方案1】:

    使用UseColumnDataType = false时,ExcelDataReader 将单元格返回为System.Object

    如果您需要返回System.String,则需要克隆DataSet 结构,将每个DataColumn 的类型设置为System.String,然后使用DataTable.ImportRow() 进行所有转换给你System.String。如果您需要更多地控制格式(例如:转换 Date 类型),您也可以显式地进行转换。

    这是一个给你的例子......

    // NuGet reference: ExcelDataReader v3.6.0 built from https://github.com/ExcelDataReader/ExcelDataReader/ExcelDataReader
    // NuGet reference: ExcelDataReader.DataSet v3.6.0 built from https://github.com/ExcelDataReader/ExcelDataReader/ExcelDataReader.DataSet
    using ExcelDataReader;
    using System;
    using System.Data;
    using System.IO;
    using System.Linq;
    
    namespace Convert_IExcelDataReader_values_to_string
    {
        class MainClass
        {
            public static DataSet ReadExcelDataToDataSet(Stream fileStream)
            {
                DataSet excelDataSet;
                using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(fileStream))
                {
                    var dataSetConfiguration = new ExcelDataSetConfiguration()
                    {
                        UseColumnDataType = false
                    };
                    // This reads each Sheet into a DataTable and each column is of type System.Object
                    excelDataSet = reader.AsDataSet(dataSetConfiguration);
                }
    
                var stringDataSet = ConvertToDataSetOfStrings(excelDataSet);
                return stringDataSet;
            }
    
            private static DataSet ConvertToDataSetOfStrings(DataSet sourceDataSet)
            {
                var result = new DataSet();
                result.Tables.AddRange(
                    sourceDataSet.Tables.Cast<DataTable>().Select(srcDataTable =>
                    {
                        var destDataTable = new DataTable(srcDataTable.TableName, srcDataTable.Namespace);
                        // Copy each source column as System.String...
                        destDataTable.Columns.AddRange(
                            srcDataTable.Columns.Cast<DataColumn>()
                                .Select(col => new DataColumn(col.ColumnName, typeof(String)))
                                .ToArray()
                                );
                        // Implicitly convert all source cells to System.String using DataTable.ImportRow()
                        srcDataTable.Rows.OfType<DataRow>()
                        .ToList()
                        .ForEach(row => destDataTable.ImportRow(row));
                        return destDataTable;
                    })
                    .ToArray()
                    );
                return result;
            }
    
            public static void Main(string[] args)
            {
                using (var stream = File.Open("TestOpenXml.xlsx", FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    var dataSet = ReadExcelDataToDataSet(stream);
                }
            }
        }
    }
    

    希望这会有所帮助!

    【讨论】:

    • 根据我的问题here,有没有办法使用“ExcelDataReader”获取背景颜色?
    【解决方案2】:

    使用扩展的非 LINQ 版本添加到 @AlwaysLearning 答案。

    public static class DataSetExtensions
    {
        public static DataSet ToAllStringFields(this DataSet ds)
        {
            // Clone function -> does not copy the data, but just the structure.
            var newDs = ds.Clone();
            foreach (DataTable table in newDs.Tables)
            {
                // if the column is not string type -> set as string.
                foreach (DataColumn col in table.Columns)
                {
                    if (col.DataType != typeof(string))
                        col.DataType = typeof(string);
                }
            }
    
            // imports all rows.
            foreach (DataTable table in ds.Tables)
            {
                var targetTable = newDs.Tables[table.TableName];
                foreach (DataRow row in table.Rows)
                {
                    targetTable.ImportRow(row);
                }
            }
    
            return newDs;
        }
    }
    

    用法:

    public DataSet ReadExcelDataToDataSet(Stream fileStream)
    {
        DataTable dataInExcelSheet = new DataTable();
        IExcelDataReader excelReader = ExcelReaderFactory.CreateReader(fileStream);
        DataSet excelDataSet = excelReader.AsDataSet(new ExcelDataSetConfiguration()
        {
            UseColumnDataType = false
        }).ToAllStringFields();
        excelReader.Close();
        return excelDataSet;
    }
    

    【讨论】:

    • 根据我的问题here,有没有办法使用“ExcelDataReader”获取背景颜色?
    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多