关于c#:调用SaveAs方法时出错

Getting error on calling SaveAs method

我正在尝试在我的 C#/Winforms 应用程序中使用 MS Excel 互操作从 excel 文件创建 csv 文件。

我在下面的代码中的 SaveAs 方法上遇到了这个错误。

'The file could not be accessed. Try one of the following:

a€¢ Make sure the specified folder exists. a€¢ Make sure the folder that
contains the file is not read-only. a€¢ Make sure the file name does
not contain any of the following characters: < > ? [ ] : | or
* a€¢ Make sure the file/path name doesn't contain more than 218
characters.'z

我尝试在 Workbook 的 Open(...) 方法中将 readonly 设置为 false,如下所示:
插入数据后保存excel文件时出现问题,但仍然出现相同的错误。

在我的代码中,csv 文件路径是:C:\\\\\\\\
如果我将 csv 文件路径更改为 C:\\\\\\\\SomeFolder 或某些共享 UNC 路径,则不会出现此错误。

请指教。C盘是否存在权限问题?

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.DisplayAlerts = false;
xlApp.Visible = false;
wbkSrc = xlApp.Workbooks.Open(m_sSrcFil,
                        Type.Missing, false, Type.Missing, Type.Missing,
                        Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                        Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                        Type.Missing, Type.Missing);


                wstSrc = (Worksheet)wbkSrc.Worksheets[sSrcSht];
                //wstSrc.Activate();

                rngWork = wstSrc.Cells.get_Range("H:H", System.Reflection.Missing.Value);
                rngWork.NumberFormat ="General";

                dteTmpDate = Convert.ToDateTime(m_sBusDate);
                sTmpFileName = m_sSrcFil.Substring(0, m_sSrcFil.IndexOf(".")) +"_" +
                    m_sUserName +"_" + dteTmpDate.ToString("yyyy_MM_dd") +".Csv";

                wstSrc.SaveAs(sTmpFileName, XlFileFormat.xlCSV, Type.Missing,
                    Type.Missing, true, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing);


显然 sTmpFileName 是无效路径。错误消息告诉你。也许 m_sUserName 包含不允许的字符。也许它是一个 DOMAIN\\USER 格式的用户名。也许文件名真的太长了。或者可能还有其他事情发生。看看 sTmpFileName 的实际值,你就会有你的解释。

顺便说一句,您的代码错误地使用 SubStringIndexOf(".") 来获取没有扩展名的文件名。文件名中可以??有多个句点。扩展名就是最后一段之后的文本。考虑这些文件名以及您的代码将如何处理它们:

1
2
C:\\My.Folder.Name\\TheFile.xls
C:\\MyFolder\\TheFile.Name.xls

你应该使用 Path.GetFileNameWithoutExtension.


Excel SaveAs 非常挑剔。 File.Exists 或打开工作簿时接受 c:\\folder\\\\file.csv (注意双反斜杠)之类的内容,但在保存时不接受


如果超过 218 个字符,请检查您保存的 FilePath,然后您也会收到此错误。