我正在尝试将一个.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/CSV
,而text/CSV
都会返回错误
“System.NotSupportedException:此属性不受此属性支持 类。 ↵在System.Net.FtpWebRequest.set_ContentType(String value)“
任何想法都将受到高度赞赏
编辑:当使用\t
作为分隔符(选项卡)时,旧版本的Excel会按照我的要求执行。然而,新版本则没有。所以我猜测不同版本的Excel有不同的默认分隔符,如何强制它默认为逗号?
答案 0 :(得分:0)
尝试将FtpWebRequest.UseBinary标记设置为true
,这应该保留文件。
另外,对于这样的问题,您应该使用某种文件比较器(WinMerge对文本文件很好)来查看问题是否与Ftp上传有关。如果文件已经证明100%等于上传的内容,请从问题中删除任何与Ftp相关的信息,因为问题在于Excel如何处理您的文件。
答案 1 :(得分:0)
所以我设法通过改变来解决我的问题:
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/
如果任何人能够更好地解释这一点,请随时编辑我的答案,无论如何,只要其他任何人像我一样被卡住,我就会发布它。