Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions src/MiniExcel/Csv/CsvWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,18 @@ namespace MiniExcelLibs.Csv
{
internal class CsvWriter : IExcelWriter, IDisposable
{
private readonly Stream _stream;
private readonly StreamWriter _writer;
private readonly CsvConfiguration _configuration;
private readonly bool _printHeader;
private object _value;
private readonly StreamWriter _writer;
private readonly object _value;
private bool _disposedValue;

public CsvWriter(Stream stream, object value, IConfiguration configuration, bool printHeader)
{
_stream = stream;
_configuration = configuration == null ? CsvConfiguration.DefaultConfiguration : (CsvConfiguration)configuration;
_printHeader = printHeader;
_value = value;
_writer = _configuration.StreamWriterFunc(_stream);
_writer = _configuration.StreamWriterFunc(stream);
}

public int[] SaveAs()
Expand Down
4 changes: 2 additions & 2 deletions src/MiniExcel/ExcelFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ internal static IExcelReader GetProvider(Stream stream, ExcelType excelType, ICo
case ExcelType.XLSX:
return new ExcelOpenXmlSheetReader(stream, configuration);
default:
throw new NotSupportedException("Please Issue for me");
throw new NotSupportedException("Something went wrong. Please report this issue you are experiencing with MiniExcel.");
}
}
}
Expand Down Expand Up @@ -55,7 +55,7 @@ internal static IExcelTemplateAsync GetProvider(Stream stream, IConfiguration co
var valueExtractor = new InputValueExtractor();
return new ExcelOpenXmlTemplate(stream, configuration, valueExtractor);
default:
throw new NotSupportedException("Please Issue for me");
throw new NotSupportedException("Something went wrong. Please report this issue you are experiencing with MiniExcel.");
}
}
}
Expand Down
21 changes: 17 additions & 4 deletions src/MiniExcel/OpenXml/ExcelOpenXmlSheetWriter.Async.cs
Original file line number Diff line number Diff line change
Expand Up @@ -527,11 +527,14 @@ private async Task InsertContentTypesXmlAsync(CancellationToken cancellationToke
await GenerateContentTypesXmlAsync(cancellationToken);
return;
}

#if NET5_0_OR_GREATER
await using (var stream = contentTypesZipEntry.Open())
#else
using (var stream = contentTypesZipEntry.Open())
#endif
{
var doc = XDocument.Load(stream);
var ns = doc.Root.GetDefaultNamespace();
var ns = doc.Root?.GetDefaultNamespace();
var typesElement = doc.Descendants(ns + "Types").Single();

var partNames = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
Expand Down Expand Up @@ -562,9 +565,14 @@ private async Task CreateZipEntryAsync(string path, string contentType, string c
cancellationToken.ThrowIfCancellationRequested();

var entry = _archive.CreateEntry(path, CompressionLevel.Fastest);

#if NET5_0_OR_GREATER
await using (var zipStream = entry.Open())
#else
using (var zipStream = entry.Open())
using (var writer = new MiniExcelAsyncStreamWriter(zipStream, _utf8WithBom, _configuration.BufferSize, cancellationToken))
await writer.WriteAsync(content);
#endif
using (var writer = new MiniExcelAsyncStreamWriter(zipStream, _utf8WithBom, _configuration.BufferSize, cancellationToken))
await writer.WriteAsync(content);

if (!string.IsNullOrEmpty(contentType))
_zipDictionary.Add(path, new ZipPackageInfo(entry, contentType));
Expand All @@ -575,7 +583,12 @@ private async Task CreateZipEntryAsync(string path, byte[] content, Cancellation
cancellationToken.ThrowIfCancellationRequested();

var entry = _archive.CreateEntry(path, CompressionLevel.Fastest);

#if NET5_0_OR_GREATER
await using (var zipStream = entry.Open())
#else
using (var zipStream = entry.Open())
#endif
await zipStream.WriteAsync(content, 0, content.Length, cancellationToken);
}
}
Expand Down
109 changes: 49 additions & 60 deletions src/MiniExcel/OpenXml/ExcelOpenXmlStyles.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
namespace MiniExcelLibs.OpenXml
{
using MiniExcelLibs.Utils;
using MiniExcelLibs.Zip;
using System;
using System.Collections.Generic;
using MiniExcelLibs.Utils;
using MiniExcelLibs.Zip;
using System;
using System.Collections.Generic;

namespace MiniExcelLibs.OpenXml
{
internal class ExcelOpenXmlStyles
{
private static readonly string[] _ns = { Config.SpreadsheetmlXmlns, Config.SpreadsheetmlXmlStrictns };
Expand All @@ -14,68 +14,68 @@ internal class ExcelOpenXmlStyles

public ExcelOpenXmlStyles(ExcelOpenXmlZip zip)
{
using (var Reader = zip.GetXmlReader(@"xl/styles.xml"))
using (var reader = zip.GetXmlReader(@"xl/styles.xml"))
{
if (!XmlReaderHelper.IsStartElement(Reader, "styleSheet", _ns))
if (!XmlReaderHelper.IsStartElement(reader, "styleSheet", _ns))
return;
if (!XmlReaderHelper.ReadFirstContent(Reader))
if (!XmlReaderHelper.ReadFirstContent(reader))
return;
while (!Reader.EOF)

while (!reader.EOF)
{
if (XmlReaderHelper.IsStartElement(Reader, "cellXfs", _ns))
if (XmlReaderHelper.IsStartElement(reader, "cellXfs", _ns))
{
if (!XmlReaderHelper.ReadFirstContent(Reader))
if (!XmlReaderHelper.ReadFirstContent(reader))
continue;

var index = 0;
while (!Reader.EOF)
while (!reader.EOF)
{
if (XmlReaderHelper.IsStartElement(Reader, "xf", _ns))
if (XmlReaderHelper.IsStartElement(reader, "xf", _ns))
{
int.TryParse(Reader.GetAttribute("xfId"), out var xfId);
int.TryParse(Reader.GetAttribute("numFmtId"), out var numFmtId);
int.TryParse(reader.GetAttribute("xfId"), out var xfId);
int.TryParse(reader.GetAttribute("numFmtId"), out var numFmtId);
_cellXfs.Add(index, new StyleRecord() { XfId = xfId, NumFmtId = numFmtId });
Reader.Skip();
reader.Skip();
index++;
}
else if (!XmlReaderHelper.SkipContent(Reader))
else if (!XmlReaderHelper.SkipContent(reader))
break;
}
}
else if (XmlReaderHelper.IsStartElement(Reader, "cellStyleXfs", _ns))
else if (XmlReaderHelper.IsStartElement(reader, "cellStyleXfs", _ns))
{
if (!XmlReaderHelper.ReadFirstContent(Reader))
if (!XmlReaderHelper.ReadFirstContent(reader))
continue;

var index = 0;
while (!Reader.EOF)
while (!reader.EOF)
{
if (XmlReaderHelper.IsStartElement(Reader, "xf", _ns))
if (XmlReaderHelper.IsStartElement(reader, "xf", _ns))
{
int.TryParse(Reader.GetAttribute("xfId"), out var xfId);
int.TryParse(Reader.GetAttribute("numFmtId"), out var numFmtId);
int.TryParse(reader.GetAttribute("xfId"), out var xfId);
int.TryParse(reader.GetAttribute("numFmtId"), out var numFmtId);

_cellStyleXfs.Add(index, new StyleRecord() { XfId = xfId, NumFmtId = numFmtId });
Reader.Skip();
reader.Skip();
index++;
}
else if (!XmlReaderHelper.SkipContent(Reader))
else if (!XmlReaderHelper.SkipContent(reader))
break;
}
}
else if (XmlReaderHelper.IsStartElement(Reader, "numFmts", _ns))
else if (XmlReaderHelper.IsStartElement(reader, "numFmts", _ns))
{
if (!XmlReaderHelper.ReadFirstContent(Reader))
if (!XmlReaderHelper.ReadFirstContent(reader))
continue;

while (!Reader.EOF)
while (!reader.EOF)
{
if (XmlReaderHelper.IsStartElement(Reader, "numFmt", _ns))
if (XmlReaderHelper.IsStartElement(reader, "numFmt", _ns))
{
int.TryParse(Reader.GetAttribute("numFmtId"), out var numFmtId);
var formatCode = Reader.GetAttribute("formatCode");


int.TryParse(reader.GetAttribute("numFmtId"), out var numFmtId);
var formatCode = reader.GetAttribute("formatCode");

//TODO: determine the type according to the format
var type = typeof(string);
if (DateTimeHelper.IsDateTimeFormat(formatCode))
Expand All @@ -84,15 +84,15 @@ public ExcelOpenXmlStyles(ExcelOpenXmlZip zip)
}

_customFormats.Add(numFmtId, new NumberFormatString(formatCode, type));
Reader.Skip();
reader.Skip();
}
else if (!XmlReaderHelper.SkipContent(Reader))
else if (!XmlReaderHelper.SkipContent(reader))
{
break;
}
}
}
else if (!XmlReaderHelper.SkipContent(Reader))
else if (!XmlReaderHelper.SkipContent(reader))
{
break;
}
Expand All @@ -102,52 +102,41 @@ public ExcelOpenXmlStyles(ExcelOpenXmlZip zip)

public NumberFormatString GetStyleFormat(int index)
{
if (_cellXfs.TryGetValue(index, out var styleRecord))
{
if (Formats.TryGetValue(styleRecord.NumFmtId, out var numberFormat))
{
return numberFormat;
}
else if (_customFormats.TryGetValue(styleRecord.NumFmtId, out var customNumberFormat))
{
return customNumberFormat;
}
if (!_cellXfs.TryGetValue(index, out var styleRecord))
return null;
}

if (Formats.TryGetValue(styleRecord.NumFmtId, out var numberFormat))
return numberFormat;

if (_customFormats.TryGetValue(styleRecord.NumFmtId, out var customNumberFormat))
return customNumberFormat;

return null;
}

public object ConvertValueByStyleFormat(int index, object value)
{
var sf = this.GetStyleFormat(index);
if (sf == null)
return value;
if (sf.Type == null)
var sf = GetStyleFormat(index);
if (sf?.Type == null)
return value;

if (sf.Type == typeof(DateTime?))
{
if (double.TryParse(value?.ToString(), out var s))
{
if (s >= DateTimeHelper.OADateMaxAsDouble || s <= DateTimeHelper.OADateMinAsDouble)
{
return value;
}
return DateTimeHelper.FromOADate(s);
return DateTimeHelper.IsValidOADateTime(s) ? DateTime.FromOADate(s) : value;
}
}
else if (sf.Type == typeof(TimeSpan?))
{
if (double.TryParse(value?.ToString(), out var number))
{
return TimeSpan.FromDays(number);
}
}

return value;
}

private static Dictionary<int, NumberFormatString> Formats { get; } = new Dictionary<int, NumberFormatString>()
private static Dictionary<int, NumberFormatString> Formats { get; } = new Dictionary<int, NumberFormatString>
{
{ 0, new NumberFormatString("General",typeof(string)) },
{ 1, new NumberFormatString("0",typeof(decimal?)) },
Expand Down
6 changes: 2 additions & 4 deletions src/MiniExcel/Utils/CustomPropertyHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -303,10 +303,8 @@ internal static bool TryGetTypeColumnInfo(Type type, Configuration configuration
return false;
}

if (type.IsValueType)
throw new NotImplementedException($"MiniExcel does not support only {type.Name} value generic type");
if (type == typeof(string) || type == typeof(DateTime) || type == typeof(Guid))
throw new NotImplementedException($"MiniExcel does not support only {type.Name} generic type");
if (type.IsValueType || type == typeof(string))
throw new NotSupportedException($"MiniExcel does not support the use of {type.FullName} as a generic type");

if (ValueIsNeededToDetermineProperties(type))
{
Expand Down
Loading