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
110 changes: 27 additions & 83 deletions src/MiniExcel/Csv/CsvWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace MiniExcelLibs.Csv
{
internal class CsvWriter : IExcelWriter, IDisposable
internal partial class CsvWriter : IExcelWriter, IDisposable
{
private readonly StreamWriter _writer;
private readonly CsvConfiguration _configuration;
Expand All @@ -27,26 +27,6 @@ public CsvWriter(Stream stream, object value, IConfiguration configuration, bool
_writer = _configuration.StreamWriterFunc(stream);
}

public int[] SaveAs()
{
if (_value == null)
{
_writer.Write("");
_writer.Flush();
return new int[0];
}

var rowsWritten = WriteValues(_value);
_writer.Flush();

return new[] { rowsWritten };
}

public int Insert(bool overwriteSheet = false)
{
return SaveAs().FirstOrDefault();
}

private void AppendColumn(StringBuilder rowBuilder, CellWriteInfo column)
{
rowBuilder.Append(CsvHelpers.ConvertToCsvValue(ToCsvString(column.Value, column.Prop), _configuration));
Expand All @@ -57,69 +37,31 @@ private static void RemoveTrailingSeparator(StringBuilder rowBuilder)
{
if (rowBuilder.Length == 0)
return;

rowBuilder.Remove(rowBuilder.Length - 1, 1);
}

private string GetHeader(List<ExcelColumnInfo> props) => string.Join(
_configuration.Seperator.ToString(),
props.Select(s => CsvHelpers.ConvertToCsvValue(s?.ExcelColumnName, _configuration)));

private int WriteValues(object values)
{
var writeAdapter = MiniExcelWriteAdapterFactory.GetWriteAdapter(values, _configuration);

var props = writeAdapter.GetColumns();
if (props == null)
{
_writer.Write(_configuration.NewLine);
_writer.Flush();
return 0;
}

if (_printHeader)
{
_writer.Write(GetHeader(props));
_writer.Write(_configuration.NewLine);
}

if (writeAdapter == null)
return 0;

var rowBuilder = new StringBuilder();
var rowsWritten = 0;

foreach (var row in writeAdapter.GetRows(props))
{
rowBuilder.Clear();
foreach (var column in row)
{
AppendColumn(rowBuilder, column);
}
RemoveTrailingSeparator(rowBuilder);
_writer.Write(rowBuilder.ToString());
_writer.Write(_configuration.NewLine);

rowsWritten++;
}
return rowsWritten;
}

private async Task<int> WriteValuesAsync(StreamWriter writer, object values, string seperator, string newLine, CancellationToken cancellationToken)
[Zomp.SyncMethodGenerator.CreateSyncVersion]
private async Task<int> WriteValuesAsync(StreamWriter writer, object values, string seperator, string newLine, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();

#if NETSTANDARD2_0_OR_GREATER || NET

IMiniExcelWriteAdapter writeAdapter = null;
if (!MiniExcelWriteAdapterFactory.TryGetAsyncWriteAdapter(values, _configuration, out var asyncWriteAdapter))
{
writeAdapter = MiniExcelWriteAdapterFactory.GetWriteAdapter(values, _configuration);
}
var props = writeAdapter != null ? writeAdapter.GetColumns() : await asyncWriteAdapter.GetColumnsAsync().ConfigureAwait(false);
List<ExcelColumnInfo> props;
#if SYNC_ONLY
props = writeAdapter?.GetColumns();
#else
IMiniExcelWriteAdapter writeAdapter = MiniExcelWriteAdapterFactory.GetWriteAdapter(values, _configuration);
var props = writeAdapter.GetColumns();
props = writeAdapter != null ? writeAdapter.GetColumns() : await asyncWriteAdapter.GetColumnsAsync().ConfigureAwait(false);
#endif

if (props == null)
{
await _writer.WriteAsync(_configuration.NewLine
Expand All @@ -134,7 +76,7 @@ await _writer.FlushAsync(
).ConfigureAwait(false);
return 0;
}

if (_printHeader)
{
await _writer.WriteAsync(GetHeader(props)
Expand All @@ -148,10 +90,10 @@ await _writer.WriteAsync(newLine
#endif
).ConfigureAwait(false);
}

var rowBuilder = new StringBuilder();
var rowsWritten = 0;

if (writeAdapter != null)
{
foreach (var row in writeAdapter.GetRows(props, cancellationToken))
Expand All @@ -162,7 +104,7 @@ await _writer.WriteAsync(newLine
cancellationToken.ThrowIfCancellationRequested();
AppendColumn(rowBuilder, column);
}

RemoveTrailingSeparator(rowBuilder);
await _writer.WriteAsync(rowBuilder.ToString()
#if NET5_0_OR_GREATER
Expand All @@ -174,24 +116,24 @@ await _writer.WriteAsync(newLine
.AsMemory(), cancellationToken
#endif
).ConfigureAwait(false);

rowsWritten++;
}
}
#if NETSTANDARD2_0_OR_GREATER || NET
else
{
#if !SYNC_ONLY
await foreach (var row in asyncWriteAdapter.GetRowsAsync(props, cancellationToken).ConfigureAwait(false))
{
cancellationToken.ThrowIfCancellationRequested();
rowBuilder.Clear();

await foreach (var column in row.ConfigureAwait(false))
{
cancellationToken.ThrowIfCancellationRequested();
AppendColumn(rowBuilder, column);
}

RemoveTrailingSeparator(rowBuilder);
await _writer.WriteAsync(rowBuilder.ToString()
#if NET5_0_OR_GREATER
Expand All @@ -203,18 +145,19 @@ await _writer.WriteAsync(newLine
.AsMemory(), cancellationToken
#endif
).ConfigureAwait(false);

rowsWritten++;
}
}
#endif
}
return rowsWritten;
}

[Zomp.SyncMethodGenerator.CreateSyncVersion]
public async Task<int[]> SaveAsAsync(CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();

var seperator = _configuration.Seperator.ToString();
var newLine = _configuration.NewLine;

Expand All @@ -239,10 +182,11 @@ await _writer.FlushAsync(
cancellationToken
#endif
).ConfigureAwait(false);

return new[] { rowsWritten };
}

[Zomp.SyncMethodGenerator.CreateSyncVersion]
public async Task<int> InsertAsync(bool overwriteSheet = false, CancellationToken cancellationToken = default)
{
var rowsWritten = await SaveAsAsync(cancellationToken).ConfigureAwait(false);
Expand All @@ -260,11 +204,11 @@ public string ToCsvString(object value, ExcelColumnInfo p)
{
return dateTime.ToString(p.ExcelFormat, _configuration.Culture);
}
return _configuration.Culture.Equals(CultureInfo.InvariantCulture)
? dateTime.ToString("yyyy-MM-dd HH:mm:ss", _configuration.Culture)
return _configuration.Culture.Equals(CultureInfo.InvariantCulture)
? dateTime.ToString("yyyy-MM-dd HH:mm:ss", _configuration.Culture)
: dateTime.ToString(_configuration.Culture);
}

if (p?.ExcelFormat != null && value is IFormattable formattableValue)
return formattableValue.ToString(p.ExcelFormat, _configuration.Culture);

Expand Down
Loading
Loading