f4cc81bb71
- Add theme system (Dark/Light palettes, ModernTheme, ThemeManager) - Add InputDialog, Spinner common view - Add DuplicatesCsvExportService - Refresh views, dialogs, and view models across tabs - Update localization strings (en/fr) - Tweak services (transfer, permissions, search, user access, ownership elevation, bulk operations) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
55 lines
2.0 KiB
C#
55 lines
2.0 KiB
C#
using System.IO;
|
|
using System.Text;
|
|
using SharepointToolbox.Core.Models;
|
|
using SharepointToolbox.Localization;
|
|
|
|
namespace SharepointToolbox.Services.Export;
|
|
|
|
/// <summary>
|
|
/// Exports SearchResult list to a UTF-8 BOM CSV file.
|
|
/// Header matches the column order in SearchHtmlExportService for consistency.
|
|
/// </summary>
|
|
public class SearchCsvExportService
|
|
{
|
|
public string BuildCsv(IReadOnlyList<SearchResult> results)
|
|
{
|
|
var T = TranslationSource.Instance;
|
|
var sb = new StringBuilder();
|
|
|
|
// Header
|
|
sb.AppendLine($"{T["report.col.file_name"]},{T["report.col.extension"]},{T["report.col.path"]},{T["report.col.created"]},{T["report.col.created_by"]},{T["report.col.modified"]},{T["report.col.modified_by"]},{T["report.col.size_bytes"]}");
|
|
|
|
foreach (var r in results)
|
|
{
|
|
sb.AppendLine(string.Join(",",
|
|
Csv(IfEmpty(System.IO.Path.GetFileName(r.Path), r.Title)),
|
|
Csv(r.FileExtension),
|
|
Csv(r.Path),
|
|
r.Created.HasValue ? Csv(r.Created.Value.ToString("yyyy-MM-dd")) : string.Empty,
|
|
Csv(r.Author),
|
|
r.LastModified.HasValue ? Csv(r.LastModified.Value.ToString("yyyy-MM-dd")) : string.Empty,
|
|
Csv(r.ModifiedBy),
|
|
r.SizeBytes.ToString()));
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
public async Task WriteAsync(IReadOnlyList<SearchResult> results, string filePath, CancellationToken ct)
|
|
{
|
|
var csv = BuildCsv(results);
|
|
await System.IO.File.WriteAllTextAsync(filePath, csv, new UTF8Encoding(encoderShouldEmitUTF8Identifier: true), ct);
|
|
}
|
|
|
|
private static string Csv(string value)
|
|
{
|
|
if (string.IsNullOrEmpty(value)) return string.Empty;
|
|
if (value.Contains(',') || value.Contains('"') || value.Contains('\n'))
|
|
return $"\"{value.Replace("\"", "\"\"")}\"";
|
|
return value;
|
|
}
|
|
|
|
private static string IfEmpty(string? value, string fallback = "")
|
|
=> string.IsNullOrEmpty(value) ? fallback : value!;
|
|
}
|