我对这个问题很是苦恼。
我有一张包含 994 行的 Excel 表,但是当我导出为 CSV 时,我得到了文本格式的 1880 行!
当然,现在我尝试重新创建原始 Excel 文件,我得到了 1880 行。
谁能告诉我这里可能发生什么事?
我刚刚找到了问题的根源:
原始文件的单元格内包含回车符,当导出为文本格式时,这些回车符会转换为新行。
现在到了最有趣的部分:文本文件已经翻译完毕,我需要将翻译后的文件重新导入 Excel,重新创建 *** 格式。有人知道我该怎么做吗?
答案1
我最终自己解决了这个问题。以下是出于文档目的的答案:
原因:
某些单元格包含换行符。导出为 CSV 时,换行符会转换为新行,而文件重新导入 Excel 时不会恢复这些新行,导致行数比原始行数多得多。
解决方案:
编写一个小应用程序,强制每行包含与原始文件完全相同数量的 TAB 字符。如果该行不包含预期数量的 TAB,则向其添加下一行,直到达到正确的 TAB 数量。插入占位符以标记内部换行符的位置。处理后,在 Excel 中打开,检查行数,然后查找并将占位符替换为换行符(Alt+010)。
以下是 C# 代码:它使用了 2 个 richtextbox 控件:
public void restoreLines{
int nbTabs = 0;
int nbPrevTabs = 0;
int totalTabs = 0;
int lineNb = 0;
string content = "";
string sSource = rtbSrc.Text;
string[] lines = Regex.Split(sSource, "µ");
foreach (string line in lines)
{
lineNb++;
nbTabs = line.Length - line.Replace("\t", "").Length;
totalTabs = nbPrevTabs + nbTabs;
if (totalTabs == 15)
{
content += line.TrimEnd() + "##µ##";
nbTabs = 0;
nbPrevTabs = 0;
totalTabs = 0;
}
else if (totalTabs > 15)
{
MessageBox.Show("Line #" + lineNb + " contains " + totalTabs + " tabs");
break;
}
else
{
content += line.TrimEnd() + "##InnerCRLF##";
nbPrevTabs += nbTabs;
nbTabs = 0;
}
}
rtbRTF.Text = content;
}
这显然是一个快速而粗糙的解决方案,但它确实有效,并且可以相对容易地适应处理受到同样问题困扰的其他文件。
答案2
我遇到了同样的问题,我通过改变代码中的函数顺序(您需要先自动适应列然后应用文本换行)解决了这个问题,就像这样
objWorksheet.Cells["A1"].LoadFromDataTable (dtSrc, true);
objWorksheet.Cells.Style.Font.SetFromFont (new Font ("Calibri", 10));
objWorksheet.Cells["J:J"].Style.WrapText = true;
objWorksheet.Cells.AutoFitColumns ();
然后我把它改成了这样:
objWorksheet.Cells["A1"].LoadFromDataTable (dtSrc, true);
objWorksheet.Cells.Style.Font.SetFromFont (new Font ("Calibri", 10));
objWorksheet.Cells.AutoFitColumns ();
objWorksheet.Cells["J:J"].Style.WrapText = true;
我希望它能帮助那些想要生成 excel 文件并保留新行的人