我在 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。我对此很困惑。
这个问题很久以前就被问到了,但无论如何我都会给出我的解决方案。
参考资料:
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 函数中,它就会很好地工作。
输出:
您是否需要在 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
似乎没有人真正愿意回答这个问题,而且它仍然是这个问题的热门搜索引擎(@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;
}
它可以进一步简化......但这样更具可读性。
你好,我想你的代码可以这样写:
using Excel = Microsoft.Office.Interop.Excel;
private static object TRANSPOSE(object Arr)
{
return (
(Excel.Application)ExcelDnaUtil.Application
).WorksheetFunction.Transpose(Arr);
}