如何使用C#读取Excel文件的数据?

ank*_*ush 65 c# excel

如何使用C#读取Excel文件?我打开一个Excel文件进​​行阅读并将其复制到剪贴板以搜索电子邮件格式,但我不知道该怎么做.

FileInfo finfo;
Excel.ApplicationClass ExcelObj = new Excel.ApplicationClass();
ExcelObj.Visible = false;

Excel.Workbook theWorkbook;
Excel.Worksheet worksheet;

if (listView1.Items.Count > 0)
{
    foreach (ListViewItem s in listView1.Items)
    {
        finfo = new FileInfo(s.Text);
        if (finfo.Extension == ".xls" || finfo.Extension == ".xlsx" || finfo.Extension == ".xlt" || finfo.Extension == ".xlsm" || finfo.Extension == ".csv")
        {
            theWorkbook = ExcelObj.Workbooks.Open(s.Text, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, false, false);

            for (int count = 1; count <= theWorkbook.Sheets.Count; count++)
            {
                worksheet = (Excel.Worksheet)theWorkbook.Worksheets.get_Item(count);
                worksheet.Activate();
                worksheet.Visible = false;
                worksheet.UsedRange.Cells.Select();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 85

好,

掌握Excel VSTO编程的一个比较困难的概念是,你没有像数组那样引用单元格,Worksheet[0][0]不会给你单元格A1,它会给你带来错误.即使在Excel打开时键入A1,您实际上也是在A1范围内输入数据.因此,您将单元格称为命名范围.这是一个例子:

Excel.Worksheet sheet = workbook.Sheets["Sheet1"] as Excel.Worksheet; 
Excel.Range range = sheet.get_Range("A1", Missing.Value)
Run Code Online (Sandbox Code Playgroud)

您现在可以输入:

range.Text // this will give you the text the user sees
range.Value2 // this will give you the actual value stored by Excel (without rounding)
Run Code Online (Sandbox Code Playgroud)

如果你想做这样的事情:

Excel.Range range = sheet.get_Range("A1:A5", Missing.Value)

if (range1 != null)
     foreach (Excel.Range r in range1)
     {
         string user = r.Text
         string value = r.Value2

     }
Run Code Online (Sandbox Code Playgroud)

可能有更好的方法,但这对我有用.

你需要使用Value2和不需要的原因Value是因为Value属性是参数化的,而C#还不支持它们.

至于清理代码,我将在明天上班时发布,我没有代码,但它是非常样板的.您只需按照创建它们的相反顺序关闭并释放对象.您不能使用Using()块,因为Excel.Application或Excel.Workbook没有实现IDisposable,如果您没有清理,您将在内存中留下挂起的Excel对象.

注意:

  • 如果你没有设置VisibilityExcel不显示的属性,这可能会让你的用户感到不安,但是如果你想要将数据删掉,那可能就足够了
  • 你可以使用OleDb,也可以.

我希望能让你开始,如果你需要进一步澄清,请告诉我.我会发一个完整的

这是一个完整的样本:

using System;
using System.IO;
using System.Reflection;
using NUnit.Framework;
using ExcelTools = Ms.Office;
using Excel = Microsoft.Office.Interop.Excel;

namespace Tests
{
    [TestFixture]
    public class ExcelSingle
    {
        [Test]
        public void ProcessWorkbook()
        {
            string file = @"C:\Users\Chris\Desktop\TestSheet.xls";
            Console.WriteLine(file);

            Excel.Application excel = null;
            Excel.Workbook wkb = null;

            try
            {
                excel = new Excel.Application();

                wkb = ExcelTools.OfficeUtil.OpenBook(excel, file);

                Excel.Worksheet sheet = wkb.Sheets["Data"] as Excel.Worksheet;

                Excel.Range range = null;

                if (sheet != null)
                    range = sheet.get_Range("A1", Missing.Value);

                string A1 = String.Empty;

                if( range != null )
                    A1 = range.Text.ToString();

                Console.WriteLine("A1 value: {0}", A1);

            }
            catch(Exception ex)
            {
                //if you need to handle stuff
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (wkb != null)
                    ExcelTools.OfficeUtil.ReleaseRCM(wkb);

                if (excel != null)
                    ExcelTools.OfficeUtil.ReleaseRCM(excel);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我明天会发布ExcelTools中的函数,我也没有这个代码.

编辑:正如所承诺的,这里是您可能需要的ExcelTools中的函数.

public static Excel.Workbook OpenBook(Excel.Application excelInstance, string fileName, bool readOnly, bool editable,
        bool updateLinks) {
        Excel.Workbook book = excelInstance.Workbooks.Open(
            fileName, updateLinks, readOnly,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, editable, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing);
        return book;
    }

public static void ReleaseRCM(object o) {
        try {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
        } catch {
        } finally {
            o = null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

坦率地说,如果你使用VB.NET,这个东西会容易得多.它在C#中,因为我没有写它.VB.NET做的选项参数很好,C#没有,因此Type.Missing.一旦你连续两次输入Type.Missing,你就会从房间里尖叫!

至于你的问题,你可以尝试以下:

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.find(VS.80).aspx

当我从会议中回来时,我会发一个例子......干杯

编辑:这是一个例子

range = sheet.Cells.Find("Value to Find",
                                                 Type.Missing,
                                                 Type.Missing,
                                                 Type.Missing,
                                                 Type.Missing,
                                                 Excel.XlSearchDirection.xlNext,
                                                 Type.Missing,
                                                 Type.Missing, Type.Missing);

range.Text; //give you the value found
Run Code Online (Sandbox Code Playgroud)

这是受此网站启发的另一个例子:

 range = sheet.Cells.Find("Value to find", Type.Missing, Type.Missing,Excel.XlLookAt.xlWhole,Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlNext,false, false, Type.Missing);
Run Code Online (Sandbox Code Playgroud)

它有助于理解参数.

PS我是那些喜欢学习COM自动化的奇怪人之一.所有这些代码都来自我为工作编写的工具,它要求我每周一从实验室处理超过1000多个电子表格.


Gre*_*lin 21

您可以使用Microsoft.Office.Interop.Excel程序集来处理Excel文件.

  1. 右键单击您的项目,然后转到Add reference.添加Microsoft.Office.Interop.Excel程序集.
  2. 包括using Microsoft.Office.Interop.Excel;使用组装.

以下是示例代码:

    using Microsoft.Office.Interop.Excel;

    //create the Application object we can use in the member functions.
    Microsoft.Office.Interop.Excel.Application _excelApp = new Microsoft.Office.Interop.Excel.Application();
    _excelApp.Visible = true;

    string fileName = "C:\\sampleExcelFile.xlsx";

    //open the workbook
    Workbook workbook = _excelApp.Workbooks.Open(fileName,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing);

    //select the first sheet        
    Worksheet worksheet = (Worksheet)workbook.Worksheets[1];

    //find the used range in worksheet
    Range excelRange = worksheet.UsedRange;

    //get an object array of all of the cells in the worksheet (their values)
    object[,] valueArray = (object[,])excelRange.get_Value(
                XlRangeValueDataType.xlRangeValueDefault);

    //access the cells
    for (int row = 1;  row <= worksheet.UsedRange.Rows.Count; ++row)
    {
        for (int col = 1; col <= worksheet.UsedRange.Columns.Count; ++col)
        {
            //access each cell
            Debug.Print(valueArray[row, col].ToString());
        }
    }

    //clean up stuffs
    workbook.Close(false, Type.Missing, Type.Missing);
    Marshal.ReleaseComObject(workbook);

    _excelApp.Quit();
    Marshal.FinalReleaseComObject(_excelApp);
Run Code Online (Sandbox Code Playgroud)


Cha*_*ara 17

你为什么不创建OleDbConnection?互联网上有很多可用的资源.这是一个例子

OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+filename+";Extended Properties=Excel 8.0");
con.Open();
try
{
     //Create Dataset and fill with imformation from the Excel Spreadsheet for easier reference
     DataSet myDataSet = new DataSet();
     OleDbDataAdapter myCommand = new OleDbDataAdapter(" SELECT * FROM ["+listname+"$]" , con);
     myCommand.Fill(myDataSet);
     con.Close();
     richTextBox1.AppendText("\nDataSet Filled");

     //Travers through each row in the dataset
     foreach (DataRow myDataRow in myDataSet.Tables[0].Rows)
     {
          //Stores info in Datarow into an array
          Object[] cells = myDataRow.ItemArray;
          //Traverse through each array and put into object cellContent as type Object
          //Using Object as for some reason the Dataset reads some blank value which
          //causes a hissy fit when trying to read. By using object I can convert to
          //String at a later point.
          foreach (object cellContent in cells)
          {
               //Convert object cellContect into String to read whilst replacing Line Breaks with a defined character
               string cellText = cellContent.ToString();
               cellText = cellText.Replace("\n", "|");
               //Read the string and put into Array of characters chars
               richTextBox1.AppendText("\n"+cellText);
          }
     }
     //Thread.Sleep(15000);
}
catch (Exception ex)
{
     MessageBox.Show(ex.ToString());
     //Thread.Sleep(15000);
}
finally
{
     con.Close();
}
Run Code Online (Sandbox Code Playgroud)

  • 链接已经死了 (7认同)
  • 我使用OleDbConnection(使用Oracle数据适配器)的一个问题是包含数字和文本的列.我有一个DataTable,其列格式为数字,缺少数据格式为文本的所有单元格.我的解决方案是在使用OleDBC获取数据之前使用interop将列的整个使用范围转换为TEXT格式. (2认同)

Chr*_* HG 6

这是 2020 年的答案 - 如果您不需要支持旧的 .xls 格式(2003 年之前),您可以使用:

或者

优点:

  • 性能- 在撰写本文时(读取 .xlsx 文件的最快方法)[https://github.com/ChrisHodges/ExcelToEnumerable#performance]。
  • 简单- 比OLE DBOpenXml更简洁

缺点:

  • LightweightExcelReaderExcelToEnumerable都不支持 .xls 文件。

免责声明:我是 LightweightExcelReader 和 ExcelToEnumerable 的作者


Hog*_*eed 5

首先,通过"打开Excel文件进​​行阅读并将其复制到剪贴板......"来了解您的意思非常重要.

这非常重要,因为有很多方法可以做到这一点,这取决于你打算做什么.让我解释:

  1. 如果你想读取一组数据并将其复制到剪贴板中并且你知道数据格式(例如列名),我建议你使用OleDbConnection打开文件,这样你就可以将xls文件内容视为数据库表,这样您就可以使用SQL指令读取数据并根据需要处理数据.

  2. 如果要使用Excel对象模型对数据执行操作,请按照开始的方式打开它.

  3. 有时候可以将xls文件视为一种csv文件,有一些像File Helpers这样的工具允许你通过在任意对象上映射结构来以简单的方式处理和打开xls文件.

另一个重点是文件的Excel版本.

不幸的是,我有一个很好的经验,即使在应用程序自动化,数据管理和插件等概念方面受到各种各样的Office自动化工作,我通常只建议使用Excel自动化或Office自动化作为最后的手段.读数据; 就好,没有更好的方法来完成这项任务.

使用自动化可能会在性能方面表现沉重,在资源成本方面,可能涉及其他与安全性相关的问题等等,最后但并非至少,与COM互操作并不是那么"免费"..所以我的建议在你的需求中思考和分析情况,然后采取更好的方式.


小智 5

try
        {
            DataTable sheet1 = new DataTable("Excel Sheet");
            OleDbConnectionStringBuilder csbuilder = new OleDbConnectionStringBuilder();
            csbuilder.Provider = "Microsoft.ACE.OLEDB.12.0";
            csbuilder.DataSource = fileLocation;
            csbuilder.Add("Extended Properties", "Excel 12.0 Xml;HDR=YES");
            string selectSql = @"SELECT * FROM [Sheet1$]";
            using (OleDbConnection connection = new OleDbConnection(csbuilder.ConnectionString))
            using (OleDbDataAdapter adapter = new OleDbDataAdapter(selectSql, connection))
            {
                connection.Open();
                adapter.Fill(sheet1);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
Run Code Online (Sandbox Code Playgroud)

这对我有用。请尝试一下,让我知道查询。