using System; using System.Collections.Generic; using System.Linq; namespace AddInPlugin { public class ChineseTableExporter { // 计算字符串的实际显示宽度(考虑中文) private static int GetDisplayWidth(string str) { if (string.IsNullOrEmpty(str)) return 0; int width = 0; foreach (char c in str) { if (IsChinese(c) || IsFullWidth(c)) { width += 2; } else { width += 1; } } return width; } // 判断是否为中文字符 private static bool IsChinese(char c) { return c >= 0x4E00 && c <= 0x9FFF; } // 判断是否为全角字符 private static bool IsFullWidth(char c) { return (c >= 0x3000 && c <= 0x303F) || // CJK Symbols (c >= 0xFF00 && c <= 0xFFEF) || // Fullwidth Forms (c >= 0x1100 && c <= 0x11FF) || // Hangul Jamo (c >= 0xAC00 && c <= 0xD7AF) || // Hangul Syllables (c >= 0x3040 && c <= 0x309F) || // Hiragana (c >= 0x30A0 && c <= 0x30FF); // Katakana } // 格式化字符串(考虑中文对齐) private static string FormatString(string str, int targetWidth, bool alignLeft = true) { int currentWidth = GetDisplayWidth(str); int padding = targetWidth - currentWidth; if (padding <= 0) return str; if (alignLeft) { return str + new string(' ', padding); } else { return new string(' ', padding) + str; } } // 导出表格 public static string ToString(int columns, List datas) { // 计算每列的最大宽度 int[] columnWidths = new int[columns]; for (int i = 0; i < columns; i++) { int maxDataWidth = datas.Max(row => GetDisplayWidth(row[i])); columnWidths[i] = maxDataWidth + 2; } string txt = string.Empty; // 写入数据 for (int i = 0; i < datas.Count; i++) { var row = datas[i]; string dataLine = string.Join(" | ", Enumerable.Range(0, row.Length) .Select(j => FormatString(row[j], columnWidths[j]))); txt += $"{dataLine}\r\n"; if (i < datas.Count - 1) { // 写入分隔线 string separator = string.Join("-+-", Array.ConvertAll(columnWidths, w => new string('-', w))); txt += $"{separator}\r\n"; } } return txt; } } }