从C#对csv文件执行excel宏
本文关键字:执行 excel 文件 csv | 更新日期: 2023-09-27 18:27:46
我需要使用C#在现有csv文件上执行现有Excel宏(用VB编写,可以使用宏编辑器从Excel复制)。我已经有了可以用来在xlsm文件上执行宏的工作代码,它看起来像这样:
using System;
using Excel = Microsoft.Office.Interop.Excel;
namespace MacroBuddy
{
public class test
{
public static void go_Macro()
{
object oMissing = System.Reflection.Missing.Value;
//create new Excel application instance
Excel.Application oExcel = new Excel.Application();
oExcel.Visible = true;
Excel.Workbooks oBooks = oExcel.Workbooks;
Excel._Workbook oBook = null;
string path = @"C:'Users'user'Desktop'test.csv";
//open file located at path
oBook = oBooks.Open(path, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
//run Macro by referencing file and the name of the Macro
RunMacro(oExcel, new Object[] { "test.xlsm!TestMacro" });
//save and close workbook
oBook.Save();
oBook.Close(false, oMissing, oMissing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook);
oBook = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks);
oBooks = null;
oExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
oExcel = null;
GC.Collect();
}
private static void RunMacro(object oApp, object[] oRunArgs)
{ oApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, oApp, oRunArgs); }
static void Main()
{ go_Macro(); }
}
}
但是,如果指定的文件是csv文件,则不起作用。因此,我需要帮助使类似的代码在csv文件上工作,或者自动将csv文件从C#转换为xlsm文件。
此外,能够将VB宏代码作为字符串,并能够使用将字符串作为参数或类似过程的方法来运行宏,这将是很有帮助的。
希望以下2个链接将帮助您打开csv文件,然后将其保存为excel格式。然后打开excel文件,执行任务。
http://msdn.microsoft.com/en-us/library/c9838808.aspx(打开CSV)http://msdn.microsoft.com/en-us/library/h1e33e36.aspx(保存excel)。
我没有首先写入csv,而是决定使用以下内容写入包含多张图纸的.xlsx文件:
public class test
{
object missing = Type.Missing;
public test()
{
Excel.Application XL = new Excel.Application();
oXL.Visible = false;
Excel.Workbook WB = XL.Workbooks.Add(missing);
Excel.Worksheet Sheet = WB.ActiveSheet as Excel.Worksheet;
oSheet.Name = "First sheet";
oSheet.Cells[1, 1] = "Written on first sheet";
Excel.Worksheet Sheet2 = WB.Sheets.Add(missing, missing, 1, missing)
as Excel.Worksheet;
Sheet2.Name = "Second sheet";
Sheet2.Cells[1, 1] = "Written on second sheet";
string fileName = @"C:'temp'SoSample.xlsx";
oWB.SaveAs(fileName, Excel.XlFileFormat.xlOpenXMLWorkbook,
missing, missing, missing, missing,
Excel.XlSaveAsAccessMode.xlNoChange,
missing, missing, missing, missing, missing);
oWB.Close(missing, missing, missing);
oXL.UserControl = true;
oXL.Quit();
}
}
然后我用下面的代码创建了工作簿:
private void button1_Click(object sender, System.EventArgs e)
{
Excel.Application oExcel;
Excel.Workbook oBook;
VBIDE.VBComponent oModule;
Office.CommandBar oCommandBar;
Office.CommandBarButton oCommandBarButton;
String sCode;
Object oMissing = System.Reflection.Missing.Value;
// Create an instance of Excel.
oExcel = new Excel.Application();
// Add a workbook.
oBook = oExcel.Workbooks.Add(@"C:'Users'user'Downloads'test.xlsm");
// Create a new VBA code module.
oModule = oBook.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);
sCode =
//paste in your macro here, with each line followed by a new line
"Sub TestMacro()'r'n" +
"Columns('"D:D'").Select'r'n" +
"Selection.Copy'r'n" +
"Columns('"F:F'").Select'r'n" +
"ActiveSheet.Paste'r'n" +
"Application.CutCopyMode = False'r'n" +
"ActiveSheet.Range('"$F$1:$F$542'").RemoveDuplicates Columns:=1, Header:=xlNo'r'n" +
"Range('"F1'").Select'r'n" +
"ActiveCell.FormulaR1C1 = '"Unique Query'"'r'n" +
"Range('"F2'").Select'r'n" +
"End Sub";
// Add the VBA macro to the new code module.
oModule.CodeModule.AddFromString(sCode);
// Make Excel visible to the user.
oExcel.Visible = true;
// Set the UserControl property so Excel won't shut down.
oExcel.UserControl = true;
// Release the variables.
oModule = null;
oBook = null;
oExcel = null;
// Collect garbage.
GC.Collect();
}
然后,我可以运行刚刚用我最初发布的代码创建的宏。