C# 写在纸上会导致;“已取名称”;
我正在学习如何使用Interop.Excel。测试Winforms程序读取现有Excel文件,检查是否存在名为“Added_by_program”的选项卡,如果存在,则删除该工作表,并创建名为“Added_by_program”的新工作表。如果我不尝试写入新工作表,程序将一次又一次地完美运行。当我试图写信给它时,我会遇到问题。如果原始文件中不存在工作表,则程序只运行一次,并正确写入新创建的工作表。但在随后的跑步中,我得到: “System.Runtime.InteropServices.COMException:'该名称已被使用。请尝试其他名称。” 用于尝试命名新图纸的行。我必须手动杀死打开的Excel实例。我错过了什么 代码(去掉不相关的行)C# 写在纸上会导致;“已取名称”;,c#,excel,winforms,excel-interop,C#,Excel,Winforms,Excel Interop,我正在学习如何使用Interop.Excel。测试Winforms程序读取现有Excel文件,检查是否存在名为“Added_by_program”的选项卡,如果存在,则删除该工作表,并创建名为“Added_by_program”的新工作表。如果我不尝试写入新工作表,程序将一次又一次地完美运行。当我试图写信给它时,我会遇到问题。如果原始文件中不存在工作表,则程序只运行一次,并正确写入新创建的工作表。但在随后的跑步中,我得到: “System.Runtime.InteropServices.COME
您是否设置了
xl.DisplayAlerts=false
否则,删除包含现有数据的工作表将显示确认对话框
如果Excel应用程序可见,工作表.Delete
将被阻止,直到对话框被确认
如果Excel应用程序不可见,您的代码将继续执行(对话框被有效取消-->删除未确认),但工作表不会被删除。您的代码从不将
foundRawSheet
设置为true,因此最后一个If
块不应运行…TIm--。foundRawSheet确实得到了设置,但在代码的一个不相关部分,所以为了简洁起见,我在我的帖子中删除了它。对不起,这绝对是误导。
using System;
using System.IO;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
namespace excelReadWrite
{
public partial class Form1 : Form
{
string readFolder = myPath;
string inFileName = @"Aram test excel file.xlsx";
string newSheetName = "Added_by_program";
Range rawRange = null;
Range pasteRange = null;
int rawCols = 0;
int rawRows = 0;
int iInSheet = 0;
int iNewSheet = 0;
int nInSheets = 0;
bool foundRawSheet = false;
bool foundNewSheet = false;
Worksheet worksheet = null;
public Form1()
{
InitializeComponent();
}
private void start_Button_Click(object sender, EventArgs e)
{
string inFile = myPath+ inFileName;
int nSheets = 0;
string sheetNames = "";
// Open Excel workbook to read
Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application();
Workbook workbook = xl.Workbooks.Open(inFile);
// Count worksheets in opened Excel file
nSheets = workbook.Worksheets.Count;
nSheets_TextBox.Text = nSheets.ToString();
nInSheets = 0;
foreach (Worksheet worksheet in workbook.Worksheets)
++nInSheets;
//foreach (Worksheet worksheet in workbook.Worksheets)
for (int iSheet = nInSheets; iSheet >= 1; --iSheet)
{
worksheet = workbook.Worksheets[iSheet];
sheetNames += " " + worksheet.Name;
// The program is going to add a worksheet. If it already exists, delete it before adding it.
if (string.Equals(worksheet.Name, newSheetName))
{
workbook.Worksheets[iSheet].Delete();
}
}
// Add a new sheet and name it
if (foundRawSheet)
{
newWorksheet = workbook.Worksheets.Add();
newWorksheet.Name = newSheetName;
// THE NEXT LINE IS THE PROBLEM LINE
// "Written" WILL BE WRITTEN TO A1:C3 WHEN THE SHEET IS CREATED, BUT THIS LINE
// CAUSES THE ERROR IN SUBSEQUENT RUNS
// IF I COMMENT IT OUT, THE PROGRAM RUNS FINE, REPEATEDLY
newWorksheet.Range["A1", "C3"].Value2 = "Written";
workbook.Save();
workbook.Close();
xl.Quit();
}
}
}