【问题标题】:Excel Interop - insert & add data by rowExcel 互操作 - 按行插入和添加数据
【发布时间】:2015-05-28 00:43:05
【问题描述】:

大家好,我需要在 excel 中的某一行下方插入空行,然后将数据添加到我插入的那些空行中......

到目前为止,我能够创建空行,但我花了很长时间试图弄清楚如何将 Range.Value 设置为 String 类型的数组

插入行的方法:

private void shiftRows(int from, int numberof)
    {
        from++;
        Range r = oXL.get_Range("A" + from.ToString(), "A" + from.ToString()).EntireRow;

        for (int i = 0; i < numberof; i++)
            r.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown);
    }
 // so this would shift the below rows by numberof times. 

这个方法是我目前所坚持的......它每次将一个数组插入新行中的一行

    public void inputRowData(string[] data, int rds)
    {
        int bestRow = getRowByRDS(rds);
        string val = getValueOfCell(bestRow, 6);
        if (val == null || val.Equals(""))
        {
            shiftRows(bestRow, data.Length);
            string[] formatedData = formatOutput(bestRow, data);
            for (int i = 0; i < formatedData.Length; i++)
            {
                Range r = oSheet.get_Range((bestRow + i).ToString() + ":" + (bestRow + i).ToString());
                r.set_Value(formatedData[i].Split('\t'));

// have tried r.Value = formatedData[i].Split('\t')
// formatedData is an array of string which contains data for each cell seperated by a tab

            }

        }
        else
        {
            Console.WriteLine("Line has some information already, skipping 1 more");
            shiftRows(bestRow, data.Length + 1);
        }

    }

【问题讨论】:

    标签: c# excel


    【解决方案1】:

    我强烈建议你:

    • 插入行而只写空行(安全和性能)
    • 设置一个大数组对象并且只一个在excel中写入(性能)

    示例(我保留了 shiftrows,但您真的应该摆脱它):

    public void inputRowData(string[] data, int rds)
    {
        int bestRow = getRowByRDS(rds);
        string val = getValueOfCell(bestRow, 6);
        if (val == null || val.Equals(""))
        {
            shiftRows(bestRow, data.Length);
            string[] formatedData = formatOutput(bestRow, data);
            // transform formated data into string[,]
            var string[][] splitedData = formatedData.Select(s => s.Split('\t')).ToArray();
            var colCount = splitedData.Max(r => r.Lenght);
            var excelData = new string[splitedData.Length, colCount]
            for (int i = 0; i < splitedData.Length; i++)
            {
                for (int j = 0; j < splitedData[i].Length; j++)
                {
                     excelData[i,j] = splitedData[i][j];
                }
            }
            oSheet.get_Range("A" + bestRow.ToString()).Resize(splitedData.Length, colCount).Value = excelData;
        }
        else
        {
            Console.WriteLine("Line has some information already, skipping 1 more");
            shiftRows(bestRow, data.Length + 1);
        }
    
    }
    

    【讨论】:

    • 请解释你写空行的意思。如何在 2 个当前行之间写入空行?
    • 假设你有从第 1 行到第 100 行的数据。你想从第 50 行开始插入 20 行。我建议你从第 50 行开始写 70 行(你想要的 20 行 + 之后的 50 行) .
    • 那需要我复制其他 50 行的内容。
    • 是的,但是这很便宜...只要尝试对其进行基准测试,您就会看到不同之处,而无需提及安全性(插入时,某些命名的单元格可能会移动或可能会影响将数据放在您的列之外,否则可能会触发不需要的事件)...再次,最好对其进行基准测试以获取您自己的意见
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 2014-09-28
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多