namespace QWERTYkez.ExcelProcessor;
///
/// Статический класс для работы с документами Excel через процессоры чтения/записи.
///
public static class ExcelProcessor
{
#region Read Operations
///
/// Пытается открыть документ только для чтения и выполнить действия.
///
/// Путь к исходному файлу .xlsx
/// Действия для выполнения над документом
/// если операция выполнена успешно, иначе
public static bool TryRead(string sourcePath, Action read)
{
return TryRead(new FileInfo(sourcePath), read);
}
///
/// Пытается открыть документ только для чтения и выполнить действия.
///
/// Объект исходного файла .xlsx
/// Действия для выполнения над документом
/// если операция выполнена успешно, иначе
public static bool TryRead(FileInfo sourceFile, Action read)
{
if (sourceFile is null || read is null)
{
#if DEBUG
Debug.WriteLine("[DEBUG] SourceFile or action is null");
#endif
return false;
}
using var processor = ExcelReader.CreateInternal(sourceFile);
if (processor is null)
return false;
try
{
read(processor);
return true;
}
catch (Exception ex)
{
#if DEBUG
Debug.WriteLine($"[DEBUG] Error in read action: {ex.Message}");
#endif
return false;
}
}
#endregion
#region Read Operations from Memory
///
/// Пытается открыть документ из массива байт только для чтения и выполнить действия.
///
/// Массив байт, содержащий документ .xlsx
/// Действия для выполнения над документом
/// если операция выполнена успешно, иначе
public static bool TryRead(byte[] data, Action read)
=> TryRead(new ReadOnlyMemory(data), read);
///
/// Пытается открыть документ из только для чтения и выполнить действия.
///
/// Буфер с документом .xlsx
/// Действия для выполнения над документом
/// если операция выполнена успешно, иначе
public static bool TryRead(ReadOnlyMemory data, Action read)
{
if (data.IsEmpty || read is null)
{
#if DEBUG
Debug.WriteLine("[DEBUG] Data is empty or action is null");
#endif
return false;
}
using var processor = ExcelReader.CreateFromData(data);
if (processor is null)
return false;
try
{
read(processor);
return true;
}
catch (Exception ex)
{
#if DEBUG
Debug.WriteLine($"[DEBUG] Error in read action from memory: {ex.Message}");
#endif
return false;
}
}
#endregion
#region Write Operations
///
/// Пытается открыть документ для записи и выполнить действия с последующей перезаписью исходного файла.
///
/// Путь к исходному файлу .xlsx
/// Действия для выполнения над документом
/// если операция выполнена успешно, иначе
public static bool TryWrite(string sourcePath, Action write)
{
return TryWrite(sourcePath, sourcePath, write);
}
///
/// Пытается открыть документ для записи и выполнить действия с последующей перезаписью исходного файла.
///
/// Объект исходного файла .xlsx
/// Действия для выполнения над документом
/// если операция выполнена успешно, иначе
public static bool TryWrite(FileInfo sourceFile, Action write)
{
return TryWrite(sourceFile, sourceFile.FullName, write);
}
///
/// Пытается открыть документ для записи, выполнить действия и сохранить результат по новому пути.
///
/// Путь к исходному файлу .xlsx
/// Путь для сохранения результата (null - перезапись исходного файла)
/// Действия для выполнения над документом
/// если операция выполнена успешно, иначе
public static bool TryWrite(string sourcePath, string? destinationPath, Action write)
{
return TryWrite(new FileInfo(sourcePath), destinationPath, write);
}
///
/// Пытается открыть документ для записи, выполнить действия и сохранить результат по новому пути.
///
/// Объект исходного файла .xlsx
/// Путь для сохранения результата (null - перезапись исходного файла)
/// Действия для выполнения над документом
/// если операция выполнена успешно, иначе
public static bool TryWrite(FileInfo sourceFile, string? destinationPath, Action write)
{
if (sourceFile is null || write is null)
{
#if DEBUG
Debug.WriteLine("[DEBUG] SourceFile or action is null");
#endif
return false;
}
using var processor = ExcelWriter.CreateInternal(sourceFile, destinationPath);
if (processor is null)
return false;
try
{
write(processor);
return true;
}
catch (Exception ex)
{
#if DEBUG
Debug.WriteLine($"[DEBUG] Error in write action: {ex.Message}");
#endif
return false;
}
}
#endregion
#region Write Operations from Memory
///
/// Пытается открыть документ из массива байт для записи, выполнить действия и сохранить результат по указанному пути.
///
/// Массив байт, содержащий документ .xlsx
/// Путь для сохранения результата
/// Действия для выполнения над документом
/// если операция выполнена успешно, иначе
public static bool TryWrite(byte[] data, string destinationPath, Action write)
=> TryWrite(new ReadOnlyMemory(data), destinationPath, write);
///
/// Пытается открыть документ из для записи, выполнить действия и сохранить результат по указанному пути.
///
/// Буфер с документом .xlsx
/// Путь для сохранения результата
/// Действия для выполнения над документом
/// если операция выполнена успешно, иначе
public static bool TryWrite(ReadOnlyMemory data, string destinationPath, Action write)
{
if (data.IsEmpty || write is null)
{
#if DEBUG
Debug.WriteLine("[DEBUG] Data is empty or action is null");
#endif
return false;
}
using var processor = ExcelWriter.CreateFromData(data, destinationPath);
if (processor is null)
return false;
try
{
write(processor);
return true;
}
catch (Exception ex)
{
#if DEBUG
Debug.WriteLine($"[DEBUG] Error in write action from memory: {ex.Message}");
#endif
return false;
}
}
#endregion
///
/// Пытается создать новый документ Excel, отредактировать его и вернуть результат в виде массива байт.
///
/// Результирующий массив байт (если операция успешна).
/// Действия для заполнения документа.
/// если операция выполнена успешно, иначе .
public static bool TryCreate(out byte[] result, Action write)
{
result = null!;
if (write is null) return false;
try
{
using var writer = ExcelWriter.CreateNew();
write(writer);
result = writer.GetDocumentBytes(); // добавим этот метод в ExcelWriter
return true;
}
catch
{
return false;
}
}
///
/// Пытается создать новый документ Excel, отредактировать его и записать в указанный поток.
///
/// Поток, в который будет записан документ.
/// Действия для заполнения документа.
/// если операция выполнена успешно, иначе .
public static bool TryCreate(Stream outputStream, Action write)
{
if (write is null || outputStream is null) return false;
try
{
using var writer = ExcelWriter.CreateNew();
write(writer);
writer.SaveTo(outputStream);
return true;
}
catch
{
return false;
}
}
///
/// Пытается создать новый документ Excel, отредактировать его и сохранить на диск.
///
/// Путь для сохранения результата.
/// Действия для заполнения документа.
/// если операция выполнена успешно, иначе .
public static bool TryCreate(string destinationPath, Action write)
{
if (string.IsNullOrEmpty(destinationPath) || write is null)
return false;
try
{
using var writer = ExcelWriter.CreateNew(destinationPath);
write(writer);
writer.Save();
return true;
}
catch
{
return false;
}
}
///
/// Пытается создать новый документ Excel, отредактировать его и прочитать результат в памяти.
///
/// Действия для заполнения документа.
/// Действия для чтения полученного документа.
/// если операция выполнена успешно, иначе .
public static bool TryRead(Action write, Action read)
{
if (write is null || read is null)
return false;
try
{
using var writer = ExcelWriter.CreateNew();
write(writer);
using var reader = writer.ToReader();
read(reader);
return true;
}
catch
{
return false;
}
}
}