Как вы собираетесь это сделать? Сбросить его в DataSet и сериализовать объекты в JSON? сделать массив и сделать то же самое? или автоматизировать сам Excel? (пожалуйста, не делайте этого). Есть много способов прочитать данные Excel и преобразовать их в объект JSON.
Здесь я собираюсь объяснить два варианта преобразования рабочего листа Excel в документ JSON.
Первый вариант — использование OLE DB Connection, а второй — использование библиотеки ExcelDataReader.
Вот как выглядит мой образец документа Excel.
Использование ОлеДбКоннектион
Раньше я читал и писал файлы Excel, используя Interop Objects. Поскольку он неуправляемый и из-за проблем с производительностью, я начал использовать OLE DB. Он относится к пространству имен System.Data.OleDb. В приведенном ниже примере я использую Microsoft ACE OLEDB 12.0 для чтения листа Excel и преобразования его в формат документа JSON; Microsoft ACE OLEDB 12.0 может подключаться к файлам Excel 2007 и более поздних версий с расширением .xlsx.
private static void UsingOleDb(string inFilePath, string outFilePath, string sheetName) { //"HDR=Yes;" indicates that the first row contains column names, not data. var connectionString = $@" Provider=Microsoft.ACE.OLEDB.12.0; Data Source={inFilePath}; Extended Properties=""Excel 12.0 Xml;HDR=YES"""; using (var conn = new OleDbConnection(connectionString)) { conn.Open(); var cmd = conn.CreateCommand(); cmd.CommandText = $@"SELECT * FROM [{sheetName}$]"; using (var dr = cmd.ExecuteReader()) { var query = (from DbDataRecord row in dr select row).Select(x => { var data = new Dictionary<string,object> { {dr.GetName(0), x[0]}, {dr.GetName(1), x[1]}, {dr.GetName(2), x[2]}, {dr.GetName(3), x[3]} }; return data; }); var json = JsonConvert.SerializeObject(query); File.WriteAllText(outFilePath, json); } } }
Использование ExcelDataReader
ExcelDataReader — легкая и быстрая библиотека, написанная на C# для чтения файлов Microsoft Excel. Это действительно полезно; Мне потребовалось меньше часа, чтобы получить именно то, что я хотел.
private static void UsingExcelDataReader(string inputFile, string outputFile) { using (var inFile = File.Open(inputFile, FileMode.Open, FileAccess.Read)) using (var outFile = File.CreateText(outputFile)) using (var reader = ExcelReaderFactory.CreateReader(inFile, new ExcelReaderConfiguration {FallbackEncoding = Encoding.GetEncoding(1252)})) using (var writer = new JsonTextWriter(outFile)) { writer.Formatting = Formatting.Indented; writer.WriteStartArray(); //You can skip the first row, as it contains the titles. reader.Read(); do { while (reader.Read()) { //We don't need an empty object var firstName = reader.GetString(0); if (string.IsNullOrEmpty(firstName)) break; writer.WriteStartObject(); //Select Columns and values writer.WritePropertyName("FirstName"); writer.WriteValue(firstName); writer.WritePropertyName("LastName"); writer.WriteValue(reader.GetString(1)); writer.WritePropertyName("Gender"); writer.WriteValue(reader.GetString(2)); writer.WritePropertyName("State"); writer.WriteValue(reader.GetString(3)); writer.WriteEndObject(); } } while (reader.NextResult()); writer.WriteEndArray(); } }
Исходный код доступен на GitHub https://github.com/nidps/ExcelToJson