c# - 动态读取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。
解决方案
要将 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);
推荐阅读
- c# - 从 EFCore 延迟加载的上下文中删除导航集合实体 - 导航集合不会立即更新
- python-3.x - 如何在centOS 8上安装不同版本的python?
- javascript - 如何使模态出现 onClick 变化?
- c - 输入的微小变化会使程序发疯
- bash - bash 检查数组中是否存在值,似乎 single(i) 试图与两位数匹配(10 是数组中的值之一)
- java - 这段代码中的异常处理得好吗?是否缺少关闭文件对象的 finally 块?
- ios - 在 App 代码中创建 MockedNetworkService 并在 MockNetworkService 中访问 App 模型
- angular - 使用角度 11 导航回上一页时如何保持滚动到的位置?
- spring-boot - 在我的 Springboot 项目中添加 swagger3 后无法将应用程序名称添加到基本 URL
- python - Python 字符串操作 { _teststr[2:12:-1]) }