我正在尝试构建一个从数据库中提取一些数据的应用程序,然后使用一些数据创建一个由Excel加载的CSV文件。代码:
foreach (xOFDocInfo cm in docs)
{
string s = bi.Agency
+ "," + cm.BatNbr.Trim()
+ "," + cm.RefNbr
+ "," + cm.DocType
+ "," + cm.OrigDocAmt.ToString()
+ "," + cm.CreateDate.ToShortDateString();
writer.WriteLine(s);
}
“cm.BatNbr”是一个6个字符的零填充数字,例如“001234”。我希望Excel将该列格式化为文本,这样我就不会在前面丢失零。我尝试了一些技巧,例如用单引号(撇号)为数字添加前缀,但我得到的只是一个撇号前缀。如果我将单元格设置为文本格式然后删除撇号,我也会丢失前面的零。
我偶然发现,如果我用百分号作为前缀,Excel会将单元格中的值转换为百分比,因此可能会有一些前缀可用于使Excel将单元格中的值作为文本我装了吗?
答案 0 :(得分:11)
您可以将数据格式化为="001234"
。这将导致Excel将其显示为001234。
foreach (xOFDocInfo cm in docs)
{
string s = bi.Agency
+ ",=\"" + cm.BatNbr.Trim()
+ "\"," + cm.RefNbr
+ "," + cm.DocType
+ "," + cm.OrigDocAmt.ToString()
+ "," + cm.CreateDate.ToShortDateString();
writer.WriteLine(s);
}
您也可以尝试使用SYLK format代替CSV。 SYLK使您可以更好地控制格式。
答案 1 :(得分:0)
尝试引用BatNbr
foreach (xOFDocInfo cm in docs)
{
string s = bi.Agency
+ ", \"" + cm.BatNbr.Trim() + "\""
+ "," + cm.RefNbr
+ "," + cm.DocType
+ "," + cm.OrigDocAmt.ToString()
+ "," + cm.CreateDate.ToShortDateString();
writer.WriteLine(s);
}
答案 2 :(得分:0)
用引号包围每个值应该可以解决你的问题(编辑:我发现现在这不会起作用,但我会在这里留下这个答案,因为其余的信息可能仍然有用)。
从技术上讲,无法在CSV中指定类型,这适用于CSV创建者和CSV阅读器。有些程序尝试从CSV推断数据类型,但这不是一种好的做法,CSV也不支持。
你可以用引号括住每个值,事实上我会推荐它,即使它是可选的。
同样重要的是,如果使用引号括起值,请确保逗号和开头引号之间没有前导空格。这会弄乱Microsoft Excel,它会将单元格渲染为空白。
答案 3 :(得分:0)
您可以在将CSV导入Excel时解决此问题。在导入和设置CSV文件的解析时,您可以选择指定数字格式。我一直使用营销列表中的邮政编码列来防止丢失新英格兰邮政编码中的前导零。
另外,正如Richard所说,你可以在数字之前添加一个关键字,然后使用Excel中的Text to Columns功能解析列。
答案 4 :(得分:0)
这对我有用:
更改行:
+ "," + cm.BatNbr.Trim()
有:
+ ",\t" + cm.BatNbr.Trim()