如何使用C#将一个Excel工作簿中特定范围的单元格复制到另一工作簿中

时间:2019-08-09 09:45:20

标签: c# excel

我需要帮助将某些数据从一个Excel工作簿中的单元格复制到另一Excel工作簿中。我在指定c#代码以查找不是第一列的指定列中的数据时遇到麻烦。 excel工作表包含有关员工详细信息的数据,例如姓名,电话号码,部门和电子邮件。我希望代码搜索列和匹配特定位置的数据,例如实习生,而不是永久的。该代码应能够复制受训人员并粘贴到另一个指定的工作簿中。

我尝试实现一个if语句,如果该单元格包含字符串'trainee',它将把数据粘贴到另一个工作簿中,仅当该列为第一列时才成功,而在实际电子表格中则不是。我在互联网上进行了搜索,但是找不到关于如何在控制台应用程序中使用c#操纵excel的结论性教程。

using Excel = Microsoft.Office.Interop.Excel;
class Program
{
     static void Main(string[] args)
    {
        var excelapp = new Excel.Application();
        excelapp.Workbooks.Add();
        string path = 
@"C:\Users\....xlsx";
        Excel.Workbook workbook = excelapp.Workbooks.Open(path);
        Excel.Worksheet workSheet = workbook.Worksheets.get_Item(1);
        var source = 
  workSheet.Range["h3:H10"].Insert(Excel.XlInsertShiftDirection.xlShiftDown);
        Excel.Range dest = workSheet.Range["F10"];
        workbook.SaveAs("Book1.xlsx");
    }
}

此当前代码将仅复制整个电子表格并将其粘贴到新工作簿中。我只想要相关数据。

1 个答案:

答案 0 :(得分:0)

互操作代码有点难以理解和使用。我建议您使用OleDb或一些OpenXML替代方法来处理Excel文件。

从您的问题中我了解到的是,该表在excel中看起来像这样,并且您要将具有“ Trainee”作为“职位”的行复制到新的WorkSheet中。

| Name | Number | Department  | Email   | Position  |
|------|--------|-------------|---------|-----------|
| A    | 1      | DepartmentA | A@a.com | Permanent |
| B    | 2      | DepartmentB | B@b.com | Trainee   |
| C    | 3      | DepartmentB | C@c.com | Trainee   |

使用OleDB获取Excel数据:

var conStr = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0};Extended Properties='Excel 12.0;HDR={1};IMEX=1'";
var pathToExcel = @"C:\Users\....xlsx";;
var udt = new DataTable();
conStr = string.Format(conStr, pathToExcel, "Yes");
using (var connExcel = new OleDbConnection(conStr))
{
    var cmdExcel = new OleDbCommand();
    var oda = new OleDbDataAdapter();

    connExcel.Open();
    var dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
    if (dtExcelSchema != null)
    {
        //Get the name of First Sheet
        var sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();


        cmdExcel.Connection = connExcel;
        cmdExcel.CommandText = "SELECT * From [" + sheetName + "]";
    }
    oda.SelectCommand = cmdExcel;
    oda.Fill(udt);
}

我们将从Excel提取的数据放入数据表中。然后,您只需编写一个简单的查询即可获取所需的任何数据,

//Getting array of DataRow with required data
var rows = udt.Select("[Position]='Trainee');
if (rows.Length > 0)
    DataTable finalDataTable = rows.CopyToDataTable();

然后,您可以根据需要将DataTable转换为另一个WorkSheet或Excel工作表。有很多方法可以做到这一点,您可以在SO上检查其他问题。 Example

您也可以使用ClosedXML。使用Excel非常容易。