Как гарантировать, что значения NULL из базы данных экспортируются в электронную таблицу Excel как значения NULL (или пуC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как гарантировать, что значения NULL из базы данных экспортируются в электронную таблицу Excel как значения NULL (или пу

Сообщение 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.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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»