我有一个C#程序,它从.txt文件创建一个Excel文件报告。
它完美无缺,但有时(经常)当我打开电子表格时,Excel会打开2个电子表格:
1表示我保存的文件。 1带有一些垃圾数据称为" Plan1"哪个没有保存。
我不确定excel在哪里找到Plan1的垃圾数据。
以下是保存电子表格的代码:
protected string ExportOC(Application app, OcFile oc, bool configurator)
{
string ocFinalName;
if (configurator)
ocFinalName = string.Format("{0}{1}", ocFinalName = oc.Name, Models.Constants.CHECK_CONFIGURATOR);
else if (oc.Error)
ocFinalName = string.Format("{0}{1}", ocFinalName = oc.Name, Models.Constants.CHECK_STRUCT_ERROR);
else
ocFinalName = string.Format("{0}{1}", ocFinalName = oc.Name, Models.Constants.CHECK_OK);
try
{
string savePath = string.Format("{0}{1}", Importer.GetPathWithType(ConfigurationManager.AppSettings[Modelos.Constants.SAVE_ROOT_PATH].ToString(), oc.Type), ocFinalName);
app.DisplayAlerts = false;
app.ActiveWorkbook.WebOptions.Encoding = Microsoft.Office.Core.MsoEncoding.msoEncodingUTF8;
app.ActiveWorkbook.SaveAs(savePath, XlFileFormat.xlOpenXMLWorkbook, Missing.Value,Missing.Value, false, false, XlSaveAsAccessMode.xlNoChange,XlSaveConflictResolution.xlUserResolution,true,Missing.Value, Missing.Value, Missing.Value);
return string.Format("{0}{1}", ocFinalName, Models.Constants.EXTENSION_EXCEL_X);
}
catch (Exception)
{
return InvalidOC(oc, Models.Constants.CHECK_NO_SAVED);
} finally
{
ClearCOM(app);
}
}
以下是我如何清理COM对象:
protected void ClearCOM(Application app)
{
try
{
app.DisplayAlerts = false;
app.ActiveWorkbook.Close(0);
app.Quit();
Marshal.ReleaseComObject(app);
}
catch
{
return;
}
}
我不确定是否应该在此处打开代码来打开电子表格,因为即使我在程序外打开文件也会出现此问题(只要我关注的话,这个问题经常发生在内部)。
感谢您的帮助
修改
工作表的名称必须包含特殊字符,如:5198416384684_003 这是我创建COM对象的方法。
public string ProcessOC(OcFile oc) {
Application app = new Application();
Workbook workbook = app.Workbooks.Add(1);
Worksheet plan = (Worksheet)workbook.Sheets[1];
plan.Name = oc.Name;
bool rightSize = false;
bool haveMoreDocuments = false;
int indexLine = 1, indexColumn = 1;
int lin = 1, col = 0;
string columnLetter = String.Empty;
string ajusteTextoNum = String.Empty;
try {
List<string> validLines = GetValidContent(oc.Lines);
foreach (string line in validLines) {
//get the txt lines and put all of them im the worksheet
}
// format the worksheet
return ExportOC(app, oc, false);
} catch (WrongPrinterException) {
return InvalidOC(oc, Modelos.Constants.CHECK_NO_PRINTER); //doesn't save
} catch (MissingFileException) {
return InvalidOC(oc, Modelos.Constants.CHECK_MISS_SOURCE_FILE); //doesn't save
} catch (Exception) {
return InvalidOC(oc, Modelos.Constants.CHECK_NO_SAVED); //doesn't save
} finally {
ClearCOM(app);
}
}
和问题本身。
很抱歉忽略一些价值观,这是公司的政治因素。 这一次,我在程序之外打开了这些数据,并不是真的很垃圾,它是另一种格式不同的报告,操作员可能以前关闭过。
也许Excel正在尝试恢复以前的会话。
我将尝试清理其他COM对象并使用Marshal.ReleaseComObject。
编辑2
我尝试清除COM对象,但仍然会立即打开2个电子表格。
这里是清除COM的代码
protected void ClearCOM(Application app, Workbook workbook, Worksheet worksheet) {
try {
app.DisplayAlerts = false;
app.ActiveWorkbook.Close(0);
Marshal.ReleaseComObject(workbook);
Marshal.ReleaseComObject(worksheet);
app.Quit();
Marshal.ReleaseComObject(app);
} catch {
return;
}
}
编辑3
我已经清理了XLSTART文件夹,但仍然没有
答案 0 :(得分:1)
对于仍然有此问题的任何人。我通过使用 Workbooks.Add
方法创建一个 Workbook
而没有给它任何参数来解决它。
所以在 OPs 问题中,改变这个:
Application app = new Application();
Workbook workbook = app.Workbooks.Add(1);
为此:
Application app = new Application();
Workbook workbook = app.Workbooks.Add(); // No parameters
Add
方法有一个可选的 Template
参数,它可以是 XlWBATemplate
类型。 OP 使用 1
作为此参数的值,在这种情况下它不是有效值。
这是文档中关于忽略参数的说明:
<块引用>如果省略此参数,Microsoft Excel 将创建一个包含许多空白工作表的新工作簿(工作表数由 SheetsInNewWorkbook 属性设置)。