通过剪贴板将制表符分隔的变量文件传输到 Excel 但在单元格内保留换行符

Transferring a tab separated variable file via clipboard to Excel but retaining line breaks WITHIN the cell

我在表格编辑器中使用 C# 脚本读取 Power BI 文件并使用剪贴板将信息获取到 Excel。两者都是新手,所以我的代码不是很好但可以工作。我的代码如下。

对于表达式字段,我使用 .Replace("\n"," ") 将换行符替换为空白 space。

否则,换行文本会移到 Excel 中的下一行,并且不再与相应的列对齐。

有什么方法可以同时实现 即用 Excel 中被识别为多行但仍保留在 Excel 单元格中的内容替换换行符。 我用谷歌搜索并阅读了多个线程并尝试了 \r、\x0A、CHAR(10)、Excel 中的 WrapText 等

var tsv = "Table_Name\tTable_MeasureCount\tMeasure_Name\tMeasure_Description\tMeasure_DisplayFolder\tMeasure_IsHidden\tMeasure_DataType\tMeasure_FormatString\tMeasure_DataCategory\tMeasure_ErrorMessage\tMeasure_Expression";

foreach(var Table in Model.Tables)

    foreach(var Measure in Table.Measures)
        {
            tsv += "\r\n" + Table.Name
            + "\t" + Table.Measures.Count 
            + "\t" + Measure.Name 
            + "\t" + Measure.Description
            + "\t" + Measure.DisplayFolder
            + "\t" + Measure.IsHidden
            + "\t" + Measure.DataType 
            + "\t" + Measure.FormatString
            + "\t" + Measure.DataCategory
            + "\t" + Measure.ErrorMessage.Replace("\n"," ")
            + "\t" + Measure.Expression.Replace("\n"," ");
        }

tsv.Output();

现在我们已经确定 CSV 是最佳选择,因为它允许 line-breaks,我建议如下:

首先创建一个简单的函数来将字符串解析为安全格式:

  public string stringToCsvSafe(string str)
  {
    return "\"" + str.Replace("\"", "\"\"") + "\"";
  }

然后在循环中构建输出字符串,如下所示:

var newRow = new List<object>() { 
    Table.Name, 
    Table.Measures.Count, 
    stringToCsvSafe(Measure.Name), 
    stringToCsvSafe(Measure.Description),
    ...
};
csv += string.Join(",", newRow) + "\n";

这是我最终得到的逻辑(我无法在表格编辑器中使用函数)

var csv = "\"Table_Name\",\"Table_MeasureCount\",\"Measure_Name\",\"Measure_Description\",\"Measure_DisplayFolder\",\"Measure_IsHidden\",\"Measure_DataType\",\"Measure_FormatString\",\"Measure_DataCategory\",\"Measure_ErrorMessage\",\"Measure_Expression\"";

string str1 = "\r\n\"";
string str2 = "\",\"";
string str3 = "\"";

//foreach(var Measure in Model.AllMeasures)
foreach(var Table in Model.Tables)
    {
    foreach(var Measure in Table.Measures)
        {
            csv += str1 + Table.Name
            + str2 + Table.Measures.Count
            + str2 + Measure.Name
            + str2 + Measure.Description
            + str2 + Measure.DisplayFolder
            + str2 + Measure.IsHidden
            + str2 + Measure.DataType
            + str2 + Measure.FormatString.Replace("\"","\"\"")
            + str2 + Measure.DataCategory
            + str2 + Measure.ErrorMessage.Replace("\"","\"\"")
            + str2 + Measure.Expression.Replace("\"","\"\"") 
            + str3;
        }
    }
            
csv.Output();