2

我正在使用下面的代码来读取 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 工作表的所有值转换为字符串并将其作为字符串值存储在数据集中。

例子:

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

4

2 回答 2

0

使用扩展的非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;
}
于 2019-07-31T12:25:14.503 回答
0

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

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

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

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

希望这可以帮助!

于 2019-07-31T12:19:40.557 回答