Я пытаюсь экспортировать результаты хранимой процедуры в электронную таблицу Excel. Однако, хотя в базе данных есть некоторые значения 0 (для температуры и часов использования), которые являются релевантными значениями, в ней также есть NULL для столбцов, в которых данные не записаны.
В этом случае при экспорте в электронную таблицу Excel все значения NULL (и допустимые 0) из базы данных становятся равными 0. Как гарантировать, что значение NULL в базе данных останется NULL в электронной таблице? Очевидно, что законные 0 (для температуры и т. д.), я бы хотел оставить 0 и в электронной таблице Excel.
На данный момент у меня есть следующий код C# (что мне добавить, чтобы гарантировать NULL — это NULL в экспорте Excel):
using System.Globalization;
using ClosedXML.Excel;
using CsvHelper;
using Microsoft.AspNetCore.Mvc;
using System.Reflection;
using Api.Utilities.Services.Abstractions;
namespace Api.Utilities.Services;
///
/// Provides functionality to export a collection of data into different formats.
///
public class DataExportService : IDataExportService
{
///
/// Exports a collection of data to an Excel file and returns the result as a file stream.
///
/// The type of the data to be exported.
/// The list of data items to be exported.
/// The name of the file to be exported, optional parameter.
///
/// A containing the Excel file.
///
public FileStreamResult ExportToExcel(IEnumerable data, string? fileName)
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Data");
var properties = typeof(T).GetProperties();
var currentRow = 1;
for (var i = 0; i < properties.Length; i++)
{
var customNameAttribute = properties.GetCustomAttribute();
var columnName = customNameAttribute != null ? customNameAttribute.Name : properties.Name;
worksheet.Cell(1, i + 1).Value = columnName;
}
currentRow++;
foreach (var item in data)
{
foreach (var nestedRow in GetNestedRows(item))
{
for (var j = 0; j < nestedRow.Count; j++)
{
var value = nestedRow[j];
worksheet.Cell(currentRow, j + 1).Value = value switch
{
null => string.Empty,
string str => str,
int intVal => intVal,
double dblVal => dblVal,
DateTime dtVal => dtVal,
bool boolVal => boolVal,
_ => value.ToString()
};
}
currentRow++;
}
}
worksheet.Columns().AdjustToContents();
MemoryStream stream = new();
workbook.SaveAs(stream);
stream.Position = 0;
return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = string.IsNullOrEmpty(fileName) ? "export.xlsx" : fileName
};
}
/// The type of the data to be exported.
/// The list of data items to be exported.
///
/// A containing the CSV file.
///
public MemoryStream ExportToCsv(IEnumerable data)
{
using var writer = new StringWriter();
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
var properties = typeof(TData).GetProperties();
foreach (var prop in properties)
{
csv.WriteField(prop.Name);
}
csv.NextRecord();
foreach (var item in data)
{
foreach (var nestedRow in GetNestedRows(item))
{
foreach (var value in nestedRow)
{
csv.WriteField(value ?? string.Empty);
}
csv.NextRecord();
}
}
MemoryStream stream = new();
StreamWriter streamWriter = new(stream);
streamWriter.Write(writer.ToString());
streamWriter.Flush();
stream.Position = 0;
return stream;
}
private List GetNestedRows(T item)
{
var result = new List();
var properties = typeof(T).GetProperties();
var parentRow = new List();
var nestedCollections = new List();
foreach (var prop in properties)
{
var value = prop.GetValue(item);
if (value is IEnumerable collection && !(value is string))
{
nestedCollections.Add((prop, collection));
}
else
{
parentRow.Add(value);
}
}
if (nestedCollections.Count == 0)
{
result.Add(parentRow);
}
else
{
foreach (var (property, collection) in nestedCollections)
{
foreach (var nestedItem in collection)
{
var newRow = new List(parentRow);
newRow.AddRange(property.PropertyType.GetProperties().Select(nestedProp => nestedProp.GetValue(nestedItem)));
result.Add(newRow);
}
}
}
return result;
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... adsheet-as
Как гарантировать, что значения NULL из базы данных экспортируются в электронную таблицу Excel как значения NULL (или пу ⇐ C#
Место общения программистов C#
1732857992
Anonymous
Я пытаюсь экспортировать результаты хранимой процедуры в электронную таблицу Excel. Однако, хотя в базе данных есть некоторые значения 0 (для температуры и часов использования), которые являются релевантными значениями, в ней также есть NULL для столбцов, в которых данные не записаны.
В этом случае при экспорте в электронную таблицу Excel все значения NULL (и допустимые 0) из базы данных становятся равными 0. Как гарантировать, что значение NULL в базе данных останется NULL в электронной таблице? Очевидно, что законные 0 (для температуры и т. д.), я бы хотел оставить 0 и в электронной таблице Excel.
На данный момент у меня есть следующий код C# (что мне добавить, чтобы гарантировать NULL — это NULL в экспорте Excel):
using System.Globalization;
using ClosedXML.Excel;
using CsvHelper;
using Microsoft.AspNetCore.Mvc;
using System.Reflection;
using Api.Utilities.Services.Abstractions;
namespace Api.Utilities.Services;
///
/// Provides functionality to export a collection of data into different formats.
///
public class DataExportService : IDataExportService
{
///
/// Exports a collection of data to an Excel file and returns the result as a file stream.
///
/// The type of the data to be exported.
/// The list of data items to be exported.
/// The name of the file to be exported, optional parameter.
///
/// A containing the Excel file.
///
public FileStreamResult ExportToExcel(IEnumerable data, string? fileName)
{
using var workbook = new XLWorkbook();
var worksheet = workbook.Worksheets.Add("Data");
var properties = typeof(T).GetProperties();
var currentRow = 1;
for (var i = 0; i < properties.Length; i++)
{
var customNameAttribute = properties[i].GetCustomAttribute();
var columnName = customNameAttribute != null ? customNameAttribute.Name : properties[i].Name;
worksheet.Cell(1, i + 1).Value = columnName;
}
currentRow++;
foreach (var item in data)
{
foreach (var nestedRow in GetNestedRows(item))
{
for (var j = 0; j < nestedRow.Count; j++)
{
var value = nestedRow[j];
worksheet.Cell(currentRow, j + 1).Value = value switch
{
null => string.Empty,
string str => str,
int intVal => intVal,
double dblVal => dblVal,
DateTime dtVal => dtVal,
bool boolVal => boolVal,
_ => value.ToString()
};
}
currentRow++;
}
}
worksheet.Columns().AdjustToContents();
MemoryStream stream = new();
workbook.SaveAs(stream);
stream.Position = 0;
return new FileStreamResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = string.IsNullOrEmpty(fileName) ? "export.xlsx" : fileName
};
}
/// The type of the data to be exported.
/// The list of data items to be exported.
///
/// A containing the CSV file.
///
public MemoryStream ExportToCsv(IEnumerable data)
{
using var writer = new StringWriter();
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
var properties = typeof(TData).GetProperties();
foreach (var prop in properties)
{
csv.WriteField(prop.Name);
}
csv.NextRecord();
foreach (var item in data)
{
foreach (var nestedRow in GetNestedRows(item))
{
foreach (var value in nestedRow)
{
csv.WriteField(value ?? string.Empty);
}
csv.NextRecord();
}
}
MemoryStream stream = new();
StreamWriter streamWriter = new(stream);
streamWriter.Write(writer.ToString());
streamWriter.Flush();
stream.Position = 0;
return stream;
}
private List GetNestedRows(T item)
{
var result = new List();
var properties = typeof(T).GetProperties();
var parentRow = new List();
var nestedCollections = new List();
foreach (var prop in properties)
{
var value = prop.GetValue(item);
if (value is IEnumerable collection && !(value is string))
{
nestedCollections.Add((prop, collection));
}
else
{
parentRow.Add(value);
}
}
if (nestedCollections.Count == 0)
{
result.Add(parentRow);
}
else
{
foreach (var (property, collection) in nestedCollections)
{
foreach (var nestedItem in collection)
{
var newRow = new List(parentRow);
newRow.AddRange(property.PropertyType.GetProperties().Select(nestedProp => nestedProp.GetValue(nestedItem)));
result.Add(newRow);
}
}
}
return result;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79235721/how-to-ensure-that-nulls-from-the-database-are-exported-to-excel-spreadsheet-as[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия