首页 > 解决方案 > 动态读取exel文件,不依赖行,写json c#

问题描述

我正在尝试从 exel 文件生成一个 json 文件。我有不同的 Excel 文件,我想阅读它们并生成一个 json 文件。我想这一定很容易,但我遇到了一些麻烦。

好的,所以我使用 Excel 阅读器工具阅读了此链接,因为这是我的领导说我们应该使用的。我尝试点击此链接https://www.hanselman.com/blog/ConvertingAnExcelWorksheetIntoAJSONDocumentWithCAndNETCoreAndExcelDataReader.aspx 我总是收到 readTimeout 和 writeTimeout 错误。它也从不读取我的 Excel。它总是在我的 json 文档上写 null。

        public static IActionResult GetData(
                [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
                ILogger log)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

            var inFilePath = "C:\\Users\\a\\Desktop\\exelreader\\Wave.xlsx";
            var outFilePath = "C:\\Users\\a\\Desktop\\exelreader\\text.json";

            using (var inFile = File.Open(inFilePath, FileMode.Open, FileAccess.Read))
            using (var outFile = File.CreateText(outFilePath))
            {
                using (var reader = ExcelReaderFactory.CreateReader(inFile, new ExcelReaderConfiguration()
                { FallbackEncoding = Encoding.GetEncoding(1252) }))
                using (var writer = new JsonTextWriter(outFile))
                {
                    writer.Formatting = Formatting.Indented; //I likes it tidy
                    writer.WriteStartArray();
                    reader.Read(); //SKIP FIRST ROW, it's TITLES.
                    do
                    {
                        while (reader.Read())
                        {
                            //peek ahead? Bail before we start anything so we don't get an empty object
                            var status = reader.GetString(1);
                            if (string.IsNullOrEmpty(status)) break;

                            writer.WriteStartObject();
                            writer.WritePropertyName("Source");
                            writer.WriteValue(reader.GetString(1));

                            writer.WritePropertyName("Event");
                            writer.WriteValue(reader.GetString(2));

                            writer.WritePropertyName("Campaign");
                            writer.WriteValue(reader.GetString(3));

                            writer.WritePropertyName("EventDate");
                            writer.WriteValue(reader.GetString(4));

                            //writer.WritePropertyName("FirstName");
                            //writer.WriteValue(reader.GetString(5).ToString());

                            //writer.WritePropertyName("LastName");
                          //writer.WriteValue(reader.GetString(6).ToString());
                            writer.WriteEndObject();
                        }
                    } while (reader.NextResult());
                    writer.WriteEndArray();
                }
            }
            //never mind this return
            return null;
        }

任何人都可以在这个问题上提供一些帮助。这个想法是将我的 Excel 文件的第一行作为标题读取,然后将其他行作为值读取,这样我就可以编写 json。

标签: c#asp.net.netasp.net-coretexel

解决方案


要将 excel 数据转换为 json,您可以尝试将 excel 数据作为数据集读取,然后将数据集序列化为 json。

试试下面的代码:

public async Task<IActionResult> ConvertExcelToJson()
{
    var inFilePath = @"xx\Wave.xlsx";
    var outFilePath = @"xx\text.json";

    using (var inFile = System.IO.File.Open(inFilePath, FileMode.Open, FileAccess.Read))
    using (var outFile = System.IO.File.CreateText(outFilePath))
    {
        using (var reader = ExcelReaderFactory.CreateReader(inFile, new ExcelReaderConfiguration()
        { FallbackEncoding = Encoding.GetEncoding(1252) }))
        {
            var ds = reader.AsDataSet(new ExcelDataSetConfiguration()
            {
                ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
                {
                    UseHeaderRow = true
                }
            });
            var table = ds.Tables[0];
            var json = JsonConvert.SerializeObject(table, Formatting.Indented);
            outFile.Write(json);
        }
    }
    return Ok();
}

对于AsDataSet,安装包ExcelDataReader.DataSet,如果你有任何相关的错误Encoding.GetEncoding(1252),配置下面的代码Startup.cs

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

参考:ExcelDataReader


推荐阅读