如何在C#中打开Excel文件?

77

我正在尝试将一些VBA代码转换为C#。我对C#还不熟悉。目前,我正在尝试从文件夹中打开一个Excel文件,如果它不存在,则创建它。我正在尝试类似以下的操作。如何使它工作?

Excel.Application objexcel;
Excel.Workbook wbexcel;
bool wbexists;
Excel.Worksheet objsht;
Excel.Range objrange;

objexcel = new Excel.Application();
if (Directory("C:\\csharp\\error report1.xls") = "")
{
    wbexcel.NewSheet();
}

else
{
    wbexcel.Open("C:\\csharp\\error report1.xls");
    objsht = ("sheet1");
}
objsht.Activate();

1
那么问题是什么?请描述一下,因为直接看比我自己创建一个空项目然后复制粘贴你的代码更容易。 - Mats Fredriksson
首先,目录部分出现了错误:“system.io.directory是一种类型,但被用作变量”。 - tksy
这会防止那个错误:if(!Directory.Exists(@"C:\csharp\error report.xls")) - dkroy
2
如果 (Directory("C:\csharp\error report1.xls") = "") 应该改为 if (!File.Exists("C:\csharp\error report1.xls"))。 - Stephen MacDougall
11个回答

104

您需要安装 Microsoft Visual Studio Tools for Office (VSTO)。

VSTO 可以在 Visual Studio 安装程序中的“工作负载 > Web & Cloud > Office/SharePoint Development”下进行选择。

接下来创建一个通用的 .NET 项目,并通过“添加引用... > 程序集”对话框将引用添加到 Microsoft.Office.Interop.Excel

Application excel = new Application();
Workbook wb = excel.Workbooks.Open(path);

Missing.Value是一个特殊的反射结构体,用于替换不必要的参数。


在较新的版本中,所需的程序集引用称为Microsoft Excel 16.0 Object Library。如果您没有安装最新版本,则可能拥有Microsoft Excel 15.0 Object Library或更旧版本,但是包含过程相同。

输入图像说明


@coder:删除 using System.Data; 或使用 "using DataTable = Microsoft.Office.Interop.Excel.DataTable;"。 - abatishchev
@coder:在任何情况下都要使用完整的名称空间.类名。 - abatishchev
当我写下 System.Data.DataTable ObjDt = ObjPriDal.ExecuteSystem.Data.DataTable(strquery); 时,它会报错,提示 DataAccessLayer 不包含 ExecuteSystem 的定义 - Nad
@coder:你不需要使用正确的表达方式。像通常声明变量类型一样使用全名。 - abatishchev
让我们在聊天中继续这个讨论 - Nad
显示剩余8条评论

62
FileInfo fi = new FileInfo("C:\\test\\report.xlsx");
if(fi.Exists)
{
    System.Diagnostics.Process.Start(@"C:\test\report.xlsx");
}
else
{
    //file doesn't exist
}

对我来说可以工作。肯定比被接受的2009年答案更简单,因为不需要额外的工具,而且本质上只有一行代码。 - Roland
1
太好了,正是我要找的,谢谢!我通过将fi直接传递给 System.Diagnostics.Process.Start(fi.ToString()); 来简化它。 - Eda
1
这绝对是最简单的方法。谢谢。 - shahsani
这是最好的解决方案。然而在.NET Core中,它必须以稍微不同的方式完成:https://stackoverflow.com/a/60970719/1018443 - nharrer

11
private void btnChoose2_Click(object sender, EventArgs e)
{
  OpenFileDialog openfileDialog1 = new OpenFileDialog();
  if (openfileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  {
    this.btnChoose2.Text = openfileDialog1.FileName;
    String filename = DialogResult.ToString();

    var excelApp = new Excel.Application();
    excelApp.Visible = true;
    excelApp.Workbooks.Open(btnChoose2.Text);
  }
}

2
Excel没有excelApp.Visible = true就不会显示。谢谢! - shaosh

4

导入

 using Excel= Microsoft.Office.Interop.Excel;
 using Microsoft.VisualStudio.Tools.Applications.Runtime;

以下是用C#打开Excel表格的代码。

    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
    Microsoft.Office.Interop.Excel.Workbook wbv = excel.Workbooks.Open("C:\\YourExcelSheet.xlsx");
    Microsoft.Office.Interop.Excel.Worksheet wx = excel.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet;

    wbv.Close(true, Type.Missing, Type.Missing);
    excel.Quit();

以下是如何使用C#打开Excel工作表的视频教程:https://www.youtube.com/watch?v=O5Dnv0tfGv4


3

打开文件,请尝试以下方法:

objexcel.Workbooks.Open(@"C:\YourPath\YourExcelFile.xls",
    missing, missing, missing, missing, missing, missing, missing,
    missing, missing, missing, missing, missing,missing, missing);

您必须提供那些看起来很蠢的“缺失”参数。如果您在VB.Net中编写相同的代码,您就不需要它们,但是在C#中您无法避免它们。


除非您使用的是VS2010 :) 噢,而且您需要_Missing.Value_ - Callum Rogers
private object _value = Missing.Value; 替换 Missing 为 _value。这样对我来说很有效。 - Chjquest

3

你应该像这样打开

        Excel.Application xlApp ;
        Excel.Workbook xlWorkBook ;
        Excel.Worksheet xlWorkSheet ;
        object misValue = System.Reflection.Missing.Value;

        xlApp = new Excel.ApplicationClass();
        xlWorkBook = xlApp.Workbooks.Open("csharp.net-informations.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

来源:http://csharp.net-informations.com/excel/csharp-open-excel.htm

ruden


2
Microsoft.Office.Interop.Excel.Application excapp;

excapp = new Microsoft.Office.Interop.Excel.Application();

object misval=System.Reflection.Missing.Value;

Workbook wrkbuk = new Workbook();

Worksheet wrksht = new Worksheet();

wrkbuk = excapp.Workbooks._Open(@"C:\Users\...\..._template_v1.0.xlsx", misval, misval, 
misval, misval, misval, misval, misval, misval, misval, misval, misval, misval);

wrksht = (Microsoft.Office.Interop.Excel.Worksheet)wrkbuk.Worksheets.get_Item(2);

2

如果您能说明具体出了什么问题,或者在运行时出现了哪些错误信息,那么我可以更好地帮助您。

但是,从快速浏览来看,您混淆了一些东西。

以下代码由于存在一些问题而无法正常工作。

if (Directory("C:\\csharp\\error report1.xls") = "")

你试图创建一个新的目录对象,指向一个文件,然后检查是否有任何错误。
实际上,你正在尝试调用一个名为Directory()的函数,然后将一个字符串赋值给结果。这不起作用,因为1.你没有一个名为Directory(string str)的函数,2.你不能将结果从函数中赋值(只能将值赋给变量)。
你应该做以下事情(至少对于这一行):
FileInfo fi = new FileInfo("C:\\csharp\\error report1.xls");
if(!fi.Exists)
{
    // Create the xl file here
}
else
{
    // Open file here
}

如果Excel代码不起作用,您需要查看Excel库的文档,谷歌应该能够为您提供。


1

代码:

 private void button1_Click(object sender, EventArgs e)
     {

        textBox1.Enabled=false;

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Excell File |*.xlsx;*,xlsx";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                string extn = Path.GetExtension(ofd.FileName);
                if (extn.Equals(".xls") || extn.Equals(".xlsx"))
                {
                    filename = ofd.FileName;

                    if (filename != "")
                    {
                        try
                        {
                            string excelfilename = Path.GetFileName(filename);


                        }
                        catch (Exception ew)
                        {
                            MessageBox.Show("Errror:" + ew.ToString());
                        }
                    }
                }
            }

1

这是商业应用程序还是一些业余爱好者/开源软件?

我问这个问题是因为根据我的经验,所有免费的.NET Excel处理替代方案都有严重的问题,原因各不相同。对于业余爱好者的事情,我通常会将jExcelApi从Java移植到C#并使用它。

但如果这是一个商业应用程序,最好购买第三方库,例如Aspose.Cells。相信我,它完全值得,因为它节省了很多时间,而时间是无价的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接