Excel 到剪贴板的非连续行范围

Excel range of non-consecutive rows to clipboard

我有一个 FindRange,它在我的 Excel sheet.

中查找带有文本 `€´(lblValutaTeken.Text) 的行

我需要做的是获取包含文本的行(多行!)并将它们复制到剪贴板。我的范围不是连续的行,这是我绝望的基础。

到目前为止我得到了这个

            object[,] cellValues = null;

        try
        {
            Excel.Range currentFind = null;
            Excel.Range firstFind = null;

            var missing = Missing.Value;

            Excel.Range RangeWithValutaSigns = xlApp.ActiveSheet.Range("g1", "g500");

            currentFind = RangeWithValutaSigns.Find(lblValutaTeken.Text, missing,
                Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
                Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false,
                missing, missing);

            while (currentFind != null)
            {
                if (firstFind == null)
                {
                    firstFind = currentFind;
                }
                else if (currentFind.get_Address(Excel.XlReferenceStyle.xlA1)
                      == firstFind.get_Address(Excel.XlReferenceStyle.xlA1))
                {
                    break;
                }
                Console.WriteLine("~~~~ currentFind.Row = " + currentFind.Row);

                Excel.Range currentFindRow = currentFind.Range[("B" + currentFind.Row), ("H" + currentFind.Row)];

                cellValues = (object[,])currentFindRow.Value2;
                foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(cellValues))
                {
                    string name = descriptor.Name;
                    object value = descriptor.GetValue(cellValues);
                    Console.WriteLine("{0}={1}", name, value);
                }
                for (int j = 1; j < 8; j++)
                {
                    Console.WriteLine(cellValues[i, j].ToString());
                }
                i = i + 1;


                currentFind = RangeWithValutaSigns.FindNext(currentFind);


            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Er is een fout gemaakt tijdens het kopiëren van de productregels uit de offerte naar het clipboard." + System.Environment.NewLine + System.Environment.NewLine + "Controleer of er een excel geopend is met daarin regels met productcodes uit de LookApp." + System.Environment.NewLine + System.Environment.NewLine + "Error message:" + System.Environment.NewLine + ex.Message);
        }

        Clipboard.SetDataObject(cellValues);

我不知道这是否对你有帮助,但这是我的想法: 如果您要搜索具有某些文本条件的行,为什么不创建一个具有该条件的字符串数组,然后根据您的条件过滤 excel 文件,然后复制这些行。

示例:

string[] Criteria = new string[1]
Criteria[0] = "Your Criteria"; (if the criteria can vary you can use * )
Criteria[1] = "Some other Criteria";

然后根据条件筛选 excel sheet: 创建范围:

Xl.Range myRange = yourSheet.UsedRange;

下一个过滤器:

myRange.AutoFilter(7, Criteria[0], xl.XlAutoFilterOperator.xlOr, Criteria[1], true);
            xl.Range my_Range= myRange.SpecialCells(xl.XlCellType.xlCellTypeVisible, Type.Missing);

现在您需要做的就是select并复制剩余的可见行并粘贴它们。

希望这会有所帮助。

因此,通过将多个其他问答的答案放在一起,我想到了这个。不是很优雅,但它正是我想要的。

步骤 1. 创建数据表

第 2 步。使用 Excel.Range.Find 查找具有我的值的范围(=单元格)(与 lblvalutasign.txt 相同,例如 € 或 $ 或 CAD)

第 3 步。每次找到范围时,我都会使用 Range.Offset 将单元格值放入相应列的数据表中。

第 4 步。将整个数据表放入数据网格视图中。如果需要,这可以是不可见的数据网格视图。按照您想要的方式布置 datagridview。

第 5 步。DataGridView.SelectAll() 并使用

复制到剪贴板
DataObject d = dataGridView1.GetClipboardContent();
            Clipboard.SetDataObject(d);

步骤 6. 使用 ctr+v 粘贴到任何地方!

        Excel.Application xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");

        Excel.Range myRange;
        myRange = xlApp.ActiveSheet.UsedRange;

        DataTable dtProductRowsFromExcel = new DataTable(); //to save all productrows form excel offer.


        dtProductRowsFromExcel.Columns.Add("Code", typeof(String)); //column 1          Excel B
        dtProductRowsFromExcel.Columns.Add("Amount", typeof(String)); //column 2        Excel C
        dtProductRowsFromExcel.Columns.Add("Unit", typeof(String)); //column 3          Excel D
        dtProductRowsFromExcel.Columns.Add("ValutaUnit", typeof(String)); //column 4    Excel E
        dtProductRowsFromExcel.Columns.Add("PriceUnit", typeof(String)); //column 5     Excel F
        dtProductRowsFromExcel.Columns.Add("ValutaTotal", typeof(String)); //column 6   Excel G
        dtProductRowsFromExcel.Columns.Add("PriceTotal", typeof(String)); //column 7    Excel H


        try
        {
            Excel.Range currentFind = null;
            Excel.Range firstFind = null;

            var missing = Missing.Value;


            Excel.Range RangeWithValutaSigns = xlApp.ActiveSheet.Range("g1", "g500");
            currentFind = RangeWithValutaSigns.Find(lblValutaTeken.Text, missing,
                Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
                Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false,
                missing, missing);

            while (currentFind != null)
            {

                if (firstFind == null)
                {
                    firstFind = currentFind;
                }
                else if (currentFind.get_Address(Excel.XlReferenceStyle.xlA1)
                      == firstFind.get_Address(Excel.XlReferenceStyle.xlA1))
                {
                    break;
                }
                Console.WriteLine("~~~~ currentFind.Row = " + currentFind.Row);

                string B = currentFind.Offset[0, -5].Value2.ToString();
                string C = (currentFind.Offset[0, -4].Value2 != null) ? currentFind.Offset[0, -4].Value2.ToString() : "";
                string D = (currentFind.Offset[0, -3].Value2 != null) ? currentFind.Offset[0, -3].Value2.ToString() : "";
                string E = (currentFind.Offset[0, -2].Value2 != null) ? currentFind.Offset[0, -2].Value2.ToString() : "";
                string F = (currentFind.Offset[0, -1].Value2 != null) ? currentFind.Offset[0, -1].Value2.ToString() : "";
                string G = currentFind.Value2.ToString();
                string H = (currentFind.Offset[0, 1].Value2 != null) ? currentFind.Offset[0, 1].Value2.ToString() : "";

                dtProductRowsFromExcel.Rows.Add(B, C, D, E, F, G, H);

                currentFind = RangeWithValutaSigns.FindNext(currentFind);

                }

            // to check datatable in output window use:
            foreach (DataRow dataRow in dtProductRowsFromExcel.Rows)
            {
                foreach (var item in dataRow.ItemArray)
                {
                    Console.WriteLine(item);
                }

            }

            dataGridView1.ReadOnly = true;
            dataGridView1.RowHeadersVisible = false;
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            dataGridView1.DataSource = dtProductRowsFromExcel;
            dataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText;
            dataGridView1.SelectAll();


            DataObject d = dataGridView1.GetClipboardContent();
            Clipboard.SetDataObject(d);


        }
        catch (Exception ex)
        {
            MessageBox.Show("Error message:" + System.Environment.NewLine + ex.Message);
        }