C# 如何允许以手动方式和编程方式修改excel数据?

C# 如何允许以手动方式和编程方式修改excel数据?,c#,excel,winapi,com-interop,excel-interop,C#,Excel,Winapi,Com Interop,Excel Interop,我正在使用C windows应用程序添加/更新Excel数据。我已经添加了Microsoft.Office.Interop.Excel引用->右键单击->添加引用->COM->类型库->Microsoft Excel 1X.0对象库。在我的表单上,我有一个面板控制面板1、一个列表框lstSamples和两个按钮btnAddSample、btnformatsheet 我的示例代码如下: using Microsoft.Office.Interop.Excel; using System; usin

我正在使用C windows应用程序添加/更新Excel数据。我已经添加了Microsoft.Office.Interop.Excel引用->右键单击->添加引用->COM->类型库->Microsoft Excel 1X.0对象库。在我的表单上,我有一个面板控制面板1、一个列表框lstSamples和两个按钮btnAddSample、btnformatsheet

我的示例代码如下:

using Microsoft.Office.Interop.Excel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;


public partial class Form1 : Form
{
    Microsoft.Office.Interop.Excel.Application excelApp;
    Workbook excelWorkBook;
    Worksheet excelWorkSheet;

    public Form1()
    {
        InitializeComponent();
        LoadExcelFile();
    }

    [DllImport("user32.dll")]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

    private void LoadExcelFile()
    {
        excelApp = new Microsoft.Office.Interop.Excel.Application();

        excelApp.Visible = true;
        excelApp.ScreenUpdating = true;
        excelApp.EnableAutoComplete = false;
        excelWorkBook = excelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
        IntPtr excelHwnd = new IntPtr(excelApp.Application.Hwnd);
        SetParent(excelHwnd, panel1.Handle);
    }

    private void btnAddSample_Click(object sender, EventArgs e)
    {
        excelWorkSheet = (Worksheet)excelWorkBook.Worksheets.get_Item(1);
        int lastUsedRow = excelWorkSheet.UsedRange.Rows.Count;
        excelWorkSheet.Cells[lastUsedRow + 1, 1] = lstSamples.SelectedItem.ToString();
        lstSamples.Items.Remove(lstSamples.SelectedItem);
    }

   private void btnFormatWorksheet_Click(object sender, EventArgs e)
   {
        Range chartRange;
        excelWorkSheet = (Worksheet)excelWorkBook.Worksheets.get_Item(1);
        chartRange = excelWorkSheet.get_Range("b2", "e9");
        chartRange.BorderAround(XlLineStyle.xlContinuous, 
        XlBorderWeight.xlMedium, XlColorIndex.xlColorIndexAutomatic, 
        XlColorIndex.xlColorIndexAutomatic);

    }
}    

请按照我提到的步骤1。运行应用程序并在字符串类型为2的A1单元格中添加数据。再次在A2单元格中添加一些数据,然后按enter 3。从lstSamples列表框中选择一个项目,然后单击btnAddSample结果,就像所选项目将添加到A3单元格4中一样。尝试修改A1或A2单元格数据。这里,lstSample具有字符串类型的项,如Test1、Test2、Test3等,。。。。。如果您能够编辑单元格,请单击“BTInformationWorksheet”,然后尝试编辑任何单元格。

为什么要引用COM DLL?您应该通过“引用”窗口中的.Net选项卡引用此位置中的.Net PIA-主互操作程序集,并浏览到:

C:\Program Files x86\Microsoft Visual Studio[版本]\Visual Studio Office工具\PIA\Office[版本]\Microsoft.Office.Interop.Excel.dll

只有在进行单元测试时,才引用COM组件。和很容易混淆,因为在解决方案资源管理器中,它们都被称为同一事物

如果这不起作用,我最初把它作为一个答案,以避免其他人的时间被浪费

艾哈迈德和我都无法用您提供的代码重现您描述的问题

请看,我输入了单元格A1和A2,然后在列表中选择了一项并单击了按钮。然后我选择单元格A2并键入Editable

ps如果你能提供复制的步骤,我很乐意再看一看

更新: 您修改的重现问题的步骤不正确,它适用于我:

更新2: 检查信息泵过滤器是否导致焦点转到另一个单元格/控件:


我无法复制你的问题。文件是如何以只读方式打开的?您甚至没有在代码中保存文件。是否手动保存,然后单击“btnAddSample”按钮?1如果文件未保存,它是只读的,还是在单击按钮之前保存?2请具体说明如何确定它在只读模式下实际打开。例如,标题中是否显示[只读]?您不能修改单元格吗?你不能储蓄吗?等等。事实上,该文件没有保存在任何地方,即使我不知道什么是文件模式[只读]或[读写],但我无法手动进行修改,无法修改代码块执行后的内容。那么,我无法复制吗?单击按钮时,在LSTAPLES中选择了什么值?它成功进入工作表了吗?另外,你能详细说明我不能手动修改的部分吗?你到底能不能输入一个单元格?如果没有,当您激活Excel并双击一个空单元格时会发生什么?在注释中重复自己对任何人都没有帮助。如果你能回答你的问题,并在评论中包括对你被问到的问题的回答,以提供更多的信息,那将更有帮助。我已经更新了问题。只需再添加一个按钮BTInformatWorksheet,并在代码块中更新时编写代码,然后尝试编辑单元格。我希望你也会遇到同样的问题。请帮帮我,我真的不知道发生了什么事。我会平平比分的。您没有确认COM或PIA,或者如果另一台电脑工作,我无法复制,因此我无法进一步协助。检查我的更新2,这可能是原因。不,不,不。您需要使用MS Office工具安装Visual Studio,这就是它丢失的原因。我向你们展示的第一件事是我在计算COM引用时投入的巨大任务是错误的,它只适用于单元测试项目。你需要在你的WinForms应用程序中引用PIA。我在这方面花了太多时间,你甚至没有确认我的第一个故障排除步骤。。。然而,你会花50%的时间寻求帮助。我真的不明白。为了擅长编程,我会像狗啃骨头一样去解决问题。我用解决方案资源管理器中显示的相同名称突出显示了令人困惑的部分。@Jeremythonpson非常感谢您的努力,我将使用MS Office tools选项重新安装VS并让您回来。