【问题标题】:Writing a CSV file to ftp将 CSV 文件写入 ftp
【发布时间】:2013-09-20 07:24:35
【问题描述】:

我正在尝试将.csv 文件从 Web 服务写入 ftp。当我在 Web 服务完成编写后下载文件时,Excel 在不同版本的 Excel 中反应不同。 2013 完全可以正常打开文件,并且完全按照我想要的方式工作。但是 2003 有以下错误,当我打开文件时,所有内容都在 A 列中,而不是分布在 b、c、d 等列中,逗号没有分隔。

这里是c# web服务的代码

string delimiter = ",";

int length = filecontents.Count;
StringBuilder sb = new StringBuilder();

for (int index = 0; index < length; index++)
    sb.AppendLine(string.Join(delimiter, filecontents[index]));

string fileName = name;
string ftpAddress = "myaddress";
string username = "myusername";
string password = "mypassword";

string str = sb.ToString();
byte[] buffer = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, buffer, 0, buffer.Length);

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + ftpAddress + fileName);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(username, password);

Stream reqStream = request.GetRequestStream();
reqStream.Write(buffer, 0, buffer.Length);

reqStream.Close();

我尝试将request.ContentType 设置为application/CSVtext/CSV 都返回错误

"System.NotSupportedException: 此属性不受此支持 班级。 ↵ 在 System.Net.FtpWebRequest.set_ContentType(String value)"

任何想法将不胜感激

编辑:当使用\t 作为分隔符(制表符)时,旧版本的 Excel 会按照我的意愿执行。但是,较新的版本则不会。所以我猜不同版本的 Excel 有不同的默认分隔符,关于如何强制它默认为逗号的任何想法?

【问题讨论】:

  • 也许您不应该只在 Excel 中使用open csv-file,而应该使用import(您可以在其中选择分隔符等)?
  • 如果是我每次都打开文件我会的。但该文件正在为最终用户创建,然后下载到他们拥有的任何机器上,无论是顶级规格还是 10 年以上的东西
  • 为用户提供指令,为他们编写excel vba宏或使用其他方式。我有一个带有原始手工 csv-export 的软件(它甚至没有将字符串放入"",所有数字都保存在中性文化中),但我对任何客户都没有问题,因为他们被指示不要使用; 在文本中和导入期间必须用他们想要使用的任何小数点符号替换 .

标签: c# csv format export-to-csv


【解决方案1】:

尝试将FtpWebRequest.UseBinary 标志设置为true,这样可以使文件保持完整。

同样对于此类问题的故障排除,您应该使用某种文件比较器(WinMerge 对文本文件很好)来查看问题是否与 Ftp 上传有关。如果文件已经证明是 100% 等于正在上传的文件,请从您的问题中删除任何与 Ftp 相关的信息,因为问题在于 Excel 如何处理您的文件。

【讨论】:

    【解决方案2】:

    所以我设法通过改变来解决我的问题:

    byte[] buffer = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, buffer, 0, buffer.Length);
    

    byte[] buffer = Encoding.UTF8.GetBytes(str);
    

    我很抱歉无法向任何阅读此作为答案的人很好地解释这一点,因为我自己并不完全理解它,但在我看来,字节的格式似乎不正确。在查看 WinMerge 时(感谢 C.Evenhuis),每个字节后面都有两个 0,因此“ID”变为“I00D00”。嗯,这就是它在 WinMerge 中的显示方式。

    将单元格 A1 作为“ID”也遇到了问题,因为 excel 认为该文件是 SYLK 而不是 csv。将其更改为“Id”解决了这个问题。 http://sharepointonline.wordpress.com/2011/08/09/excel-has-detected-that-csv-is-a-sylk-file-but-cannot-load-it/

    如果有人能更好地解释这一点,请随时编辑我的答案,我想无论如何都要发布它,以防其他人像我一样被困。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      相关资源
      最近更新 更多