【问题标题】:Copying data from different Excel worksheets in C#在 C# 中从不同的 Excel 工作表复制数据
【发布时间】:2020-03-31 03:02:14
【问题描述】:

我正在使用 Windows 桌面应用程序,我希望打开一个新的 Excel 工作簿和工作表,然后让用户选择一个现有的 Excel 文件,以便程序可以将数据复制到新工作表上。用户应该这样做两次,因为使用了两个 Excel 文件作为参考。

我知道要获取新的 Excel 工作簿和工作表,您需要执行以下操作:

Excel.Application oXL;
Excel._Workbook oWB;
Excel._Worksheet oSheet;
Excel.Range oRng;

oXL = new Excel.Application();
oXL.Visible = true;

//Get a new workbook.
oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value));
oSheet = (Excel._Worksheet)oWB.ActiveSheet;
string sheetName = comboBox1.Text;
oSheet.Name = sheetName;

但是我迷路的是如何引用用户选择的文件...... 你会...

string excelPath = string.Empty;
using (OpenFileDialog excelFile = new OpenFileDialog())
{
    excelFile.InitialDirectory = "c:\\";
    if(excelFile.ShowDialog() == DialogResult.OK)
    {

    }
}

之后如何引用所选 Excel 文件中的数据,例如,从 A 列中提取所有内容并将其复制到新的 Excel 文件中?

【问题讨论】:

  • 这是否与your question yesterday 相同,还是在其上的增量步骤?至于“如何引用用户选择的文件”,excelFile.FileName是你要找的吗?然后,您需要阅读并显示该文件中的工作表列表供用户选择。
  • 差不多。这个问题更具体,但我不熟悉引用。我确实做了 .FileName 但我认为它没有做任何事情。
  • 我已经看到了路径在代码中的路径,但我希望用户确定路径,如果这有意义的话
  • 是的。在if(excelFile.ShowDialog() == DialogResult.OK) 内部,您需要访问excelFile.FileName,因为其中包含用户选择的文件的路径。
  • 在问题中OpenFileDialog 被命名为excelFile。当然,您需要使用excelFile.FileName 并对其进行处理。我对 Excel 自动化 API 不是很熟悉,但是您可以将该路径加载到工作表对象中以获取它包含的工作表的名称,然后向用户显示另一个对话框,让他们选择他们想要的工作表。

标签: c# .net excel office-interop


【解决方案1】:

这是我过去通过互操作的剪贴板功能使用的一个小功能:

using Microsoft.Office.Interop.Excel;

public bool XlsCopyPaste(ref Workbook srcWb,
                         string srcSheetName, string srcRange,
                         ref Workbook tgtWb,
                         string tgtSheetName, string tgtRange,
                         XlPasteType pasteType)
{
    try
    {   
        var srcWs = srcWb.Sheets.Cast<Worksheet>().ToList();
        var tgtWs = tgtWb.Sheets.Cast<Worksheet>().ToList();

        var srcSheet = srcWs.FirstOrDefault(s => s.Name == srcSheetName);
        if (srcSheet != null)
        {
            var tgtSheet = tgtWs.FirstOrDefault(s => s.Name == tgtSheetName);
            if (tgtSheet == null)
            {
                tgtSheet = tgtWb.Sheets.Add();
                tgtSheet.Name = tgtSheetName;
            }

            var source = srcSheet.Range(srcRange);
            var target = tgtSheet.Range(tgtRange);

            source.Copy();
            target.PasteSpecial(pasteType, XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
        }
    }
    catch (Runtime.InteropServices.COMException ex)
    {
        return false;
    }
}

你可以这样称呼它:

var xl = new Application();
var srcWb = (Workbook)xl.Workbooks.Open(xl.GetOpenFilename("Excel Workbooks (*.xls; *.xlsx),*.xls;*.xlsx").ToString());
var tgtWb = (Workbook)xl.Workbooks.Open(xl.GetOpenFilename("Excel Workbooks (*.xls; *.xlsx),*.xls;*.xlsx").ToString());

if (XlsCopyPaste(srcWb, "Sheet1", "B:C", tgtWb, "Sheet2", "A1", XlPasteType.xlPasteAll))
{
    tgtWb.Save();
}

srcWb.Close();
tgtWb.Close();

xl.Quit();

【讨论】:

  • 我想我只需要文件,而不是函数。如果用户打开的文件名为 MyExcel,我将如何引用范围或其他内容?
  • 我不明白您的评论...我展示了一个示例,说明您如何打开两个不同的文件,提供源和目标工作表名称和范围。如果您已经知道文件名,只需将其传递给 Open() 调用而不是 GetOpenFilename。
  • 用户选择一个文件 "MyExcel" 。 “NewExcel”打开。我想以编程方式将我想要的任何范围从“MyExcel”复制到“NewExcel”
  • 看我回答的第二部分代码。它正是这样做的。给它两个工作簿引用,一个源工作表名称和范围,一个目标工作表名称和范围,决定你要复制的内容(所有内容,只是数据,只是公式等)。
  • 我明白了,但如果可以的话,我想不使用你的功能。我在想一些东西 MyExcel.get_Range(Column A) 然后将其添加到 NewExcel
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多