使用 C# 转置 excel 中的值

问题描述 投票:0回答:4

我在 stackoverflow 中看到了这个链接 - C# Transpose() method to transpose rows and columns in excelsheet,这就是我正在尝试做的。但这个人对答案毫无帮助,因为他没有提供所需的全部信息。我只是想转置 Excel 工作表中的单元格 A9:B15,然后将它们复制到新的 xls 文件、新工作表中,或者更好的是删除当前工作表内容并将其替换为新转置的粘贴内容。显然它可以通过 WorksheetFunction.Transpose 方法完成,但我似乎无法让它工作,因为我不知道 rng 或 value2 是什么?我可以创建一个数据表,但使用这种方法似乎是更合适的方法。这是 stackoverflow 问题中的代码。 。

Object[,] transposedRange = (Object[,])xlApp.WorksheetFunction.Transpose(rng.Value2);

xlApp.ActiveSheet.Range("A1").Resize(transposedRange.GetUpperBound(0), transposedRange.GetUpperBound(1)) = transposedRange;

这是迄今为止我的代码:

        Application excel = new Application();
        Workbook wb = excel.Workbooks.Open(@"P:\Visual Studio 2013\Projects\Debugging\Debugging\test.htm");
        Microsoft.Office.Interop.Excel.Range rng = excel.get_Range("A9:B15");
        Object[,] transposeRange = (Object[,])excel.WorksheetFunction.Transpose(rng);
        transposeRange = excel.ActiveSheet.Range("A1").Resize(transposeRange.GetUpperBound(0), transposeRange.GetUpperBound(1));
        wb.SaveAs(@"P:\Visual Studio 2013\Projects\Debugging\Debugging\testing.xls");

不确定我是否正确完成了 rng。我对此很困惑。

c# excel transpose
4个回答
1
投票

这个问题很久以前就被问到了,但无论如何我都会给出我的解决方案。

参考资料:

using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;

这里的技巧是获取 _Application 变量

如果您将 VSTO ADDIN 与 Workbook 一起使用,您可以这样做:

var app = Globals.ThisWorkbook.Parent as _Application;

对于其他类型的项目,请这样做:

_Application app2 = new Excel.Application();

我的样本(sheet1 是我的工作表):

        var sheet1 = Globals.Planilha1;
        var arr = new string[] 
        {
            "test1",
            "test2",
            "test3",
            "test4",
            "test5",
            "test6",
        };
        
        // For VSTO ADDINS with Workbook
        //var app = Globals.ThisWorkbook.Parent as _Application;

        // For any kind of Excel Interop project
        _Application app = new Excel.Application();

        sheet1.Range["A1:A" + arr.Length].Value = app.WorksheetFunction.Transpose(arr);

Transpose 函数只能处理数组,列表不起作用。

只需将数组放在 app.WorksheetFunction.Transpose 函数中,它就会很好地工作。

输出:

enter image description here


0
投票

您是否需要在 C# 中执行此操作?

如果您想要的正是您所说的,VBA 代码也可以完成此任务。 只是

  • 将转置范围读入变量数组
  • 清除工作表
  • 将变体数组写回到工作表中您选择的单元格处。
  • 请注意,当您将变体数组写回工作表时,目标范围必须与数组大小相同。

Option Explicit
Sub TransposeRange()
    Dim RGtoTranspose As Range
    Dim V As Variant
Set RGtoTranspose = Range("A9:B15")
V = WorksheetFunction.Transpose(RGtoTranspose)

Cells.Clear
Range("a1").Resize(UBound(V, 1), UBound(V, 2)).Value = V

End Sub

0
投票

似乎没有人真正愿意回答这个问题,而且它仍然是这个问题的热门搜索引擎(@2019 年 7 月,想想看......!),所以这是我的 2 美分...... 我不明白有关 WorksheetFunction.Transpose 方法的炒作。 “对象化”周围的事物可能不是解决此问题的最干净的方法,尤其是在使用 Excel Interop 时。归根结底,自远古以来,Transpose 一直是 PasteSpecial() 方法的动态参数。那么为什么不这样使用它呢?我认为这就是促使一些人建议使用 VBA 而不是 C# 的原因...无论如何,这段代码可以工作并且可以满足我的想法:

首先获得正确的参考资料...

using System;
using Microsoft.Office.Interop.Excel;
using Excel = Microsoft.Office.Interop.Excel;

那就试试这个...

    string filePath = @"P:\Visual Studio 2013\Projects\Debugging\Debugging\test.htm";
    string savePath = @"P:\Visual Studio 2013\Projects\Debugging\Debugging\testing.xls";

    var excelApp = new Excel.Application()
    {
        Visible = true      //This is optional
    };
    Workbooks workbook = excelApp.Workbooks;
    workbook.Open(filePath);

    Range range = excelApp.get_Range("A9:B15");
    range.Copy();

    excelApp.ActiveSheet.Range("A1").PasteSpecial(Transpose: true);     //voila... :)
    range.Delete(XlDeleteShiftDirection.xlShiftToLeft);     //delete original range 

    if (!System.IO.File.Exists(savePath))           //is the workbook already saved?
    {
        excelApp.ActiveWorkbook.SaveAs(savePath);   //save
    }
    else
    {
        Console.WriteLine("File \"{0}\" already exists.", savePath);    //or do whatever...
        Console.ReadLine();
        return;
    }

它可以进一步简化......但这样更具可读性。


0
投票

你好,我想你的代码可以这样写:

using Excel = Microsoft.Office.Interop.Excel;
private static object TRANSPOSE(object Arr)
{
    return (
        (Excel.Application)ExcelDnaUtil.Application
    ).WorksheetFunction.Transpose(Arr);
}
© www.soinside.com 2019 - 2024. All rights reserved.