【问题标题】:How to iterate excel(.xlsm) sheet rows and columns using interop(c#.Net)如何使用互操作(c#.Net)迭代excel(.xlsm)工作表行和列
【发布时间】:2020-08-24 23:41:20
【问题描述】:

我有 5 列(名称、部门、销售详细信息、工作表中的地址(.xlsm)我必须使用 for 循环使用类对象填充此工作表并在填充此工作表后填充工作表,相同的对象数据需要一些信息填充 sheet2 。我也是 excel 表格操作和互操作的新手,有人可以告诉我如何填充这些数据以及如何以编程方式切换到下一张表格以填充 sheet2 中的剩余数据。

for(int masterValues = 0; masterValues < frequencyValues.Count(); masterValues++)
{ MasterDataHeader name= new MasterDataHeader();
 masterDataHeader.department = Kvp[0].ToString();
 masterDataHeader.salesdetails= Kvp[1].ToString();
 masterDataHeader.adress = Kvp[2].ToString();
 masterDataHeader.Gebaude_art = Kvp[3].ToString();
 masterdtaheader.frequencyinfo=kvp[4]//need to update sheet2
 }

【问题讨论】:

    标签: c# excel


    【解决方案1】:
    • 您的计算机或将执行此代码的服务器上必须安装 Microsoft Office Excel 2007 或更高版本。

    • 添加对程序集的引用 -> 扩展 ->Microsoft.Office.Interop.Excel。

    • 如果您没有看到程序集,请参阅How to: Install Office Primary Interop Assemblies


    这里是如何添加新工作簿、添加两个新工作表、向这些工作表中添加数据、保存工作簿和退出 Excel 的简单示例。

    using MSExcel = Microsoft.Office.Interop.Excel;
    
    public static void FillExcel(IEnumerable<MasterDataHeader> data)
    {
        MSExcel.Application excel = new MSExcel.Application { Visible = true };
        MSExcel.Workbook workbook = excel.Workbooks.Add();
        MSExcel.Worksheet sheet1 = workbook.Worksheets.Add();
        MSExcel.Worksheet sheet2 = workbook.Worksheets.Add();
        MasterDataHeader[] masterDataHeaders = data as MasterDataHeader[] ?? data.ToArray();
    
        int row = 0;
        foreach (var item in masterDataHeaders)
        {
            row++;
            sheet1.Cells[row, 1] = item.Name;
            sheet1.Cells[row, 2] = item.Department;
            sheet1.Cells[row, 3] = item.SalesDetails;
            sheet1.Cells[row, 4] = item.Adress;
        }
    
        row = 0;
        foreach (var item in masterDataHeaders)
        {
            row++;
            sheet2.Cells[row, 1] = item.GebaudeArt;
            sheet2.Cells[row, 2] = item.Frequencyinfo;
        }
    
        workbook.Save();
        excel.Quit();
    }  
    

    如何在sheet1 中搜索员工编号并仅找到第一个匹配项

    object missing = System.Type.Missing;
    const int employeeNumber = 16845374;
    MSExcel.Range employeeNumberFound = null;
    
    employeeNumberFound = sheet1.UsedRange.Find(employeeNumber, missing,
        MSExcel.XlFindLookIn.xlValues, MSExcel.XlLookAt.xlPart,
        MSExcel.XlSearchOrder.xlByRows, MSExcel.XlSearchDirection.xlNext, false,
        missing, missing);
    
    if (employeeNumberFound != null)
    {
        Debug.WriteLine($"Employee number '{employeeNumber}' was found in cell '[{employeeNumberFound.Row},{employeeNumberFound.Column}]'");
    }
    else
    {
        Debug.WriteLine($"Employee number '{employeeNumber}' was not found");
    }
    

    有关更多信息,请查看例如here.


    获取 table2 中的最后一行并在其下方插入新行。如果 table2 为空,最后一行仍为 32。当table2为空时,新行不会增加。

    var lastRowAsRange = sheet1.Cells[32, 2].CurrentRegion.Columns[1].Cells.Find("*", missing, missing, missing, 
        XlSearchOrder.xlByRows, XlSearchDirection.xlPrevious, false, missing, missing);
    
    var lastRow = lastRowAsRange != null
        ? lastRowAsRange.Row
        : 32;
    
    var newRow = lastRowAsRange != null
        ? lastRow + 1
        : lastRow;
    
    bool inserted = sheet1.Rows[newRow].Insert(XlDirection.xlDown, XlInsertFormatOrigin.xlFormatFromLeftOrAbove);
    
    if (inserted)
    {
        sheet1.Cells[newRow, 1] = "IT";
        sheet1.Cells[newRow, 2] = "100";
        sheet1.Cells[newRow, 3] = "hyd";
    }
    

    【讨论】:

    • 嗨丹尼尔,我还有一个要求,我在一张 Excel 表格中创建了三个表,第二个表我已经填充了数据,现在我想随着数据大小的增加动态添加行。它可以根据单元格中的内容来识别单元格索引。例如,在我的表中,列名是放在 []20,2] 中的员工编号,我可以使用互操作动态获取此索引吗?希望你能理解我的要求。
    • 查看已编辑答案的第二部分。
    • 嗨丹尼尔,谢谢你在这方面帮助我。但我正在寻找如何在第二个表中动态创建新行假设工作表有 3 个表,我想在第二个表中插入一个新行表已经有几行我的意思是如果表包含三行数据我在第二个表中找到空(4th)行并且需要插入数据。第二个表从(45,8)开始希望你现在清楚我的要求跨度>
    • 如果您只想获取下一个 empry 行的索引,您将在其中插入数据,最好在您的 c# 代码中为每个表维护一个 last-row-pointer 并且您只需每插入一个新行就增加这个指针。
    • 您能否发布示例代码如何维护最后一行指针,因为我是此类操作的新手。我担心的是 table2 开始索引(32,2)会出现 Name coulmn 等等..对于这个表,当我试图获取最后一行时,我需要找出最后一个插入记录,它是 3 个表的底部。请帮帮我,这很紧急
    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多