与此问题类似(但在我的情况下不是VSTO SE),我只是想确认在Visual Studio 2005和Excel 2003中使用纯VSTO创建UDF是不可能的 - 所以,绝对清楚,我的问题是:
是否可以使用Visual Studio 2005和VSTO解决方案创建Excel 2003 UDF而无需使用任何VBA或其他技巧?
我知道ManagedXLL,ExcelDNA,Excel4Net等,但暂时不想考虑这些.
谢谢
我需要能够使用C#和Excel interop来确定在工作簿/工作表中选择了哪些单元格.如果在Excel中定义了类似的东西,那将是很好的:
Excel.Range Worksheet.GetSelectedCells();
Run Code Online (Sandbox Code Playgroud)
但我在任何文档中都没有找到它.我怎样才能做到这一点?
TIA.
如何检测打印机所在的端口(Ne01:,Ne02:,Ne99:等)?
BigCorp的计算机(WinXP)安装了Adobe Acrobat(版本7.0 Pro),它提供了一个名为"Adobe PDF"的虚拟打印机.如果在录制宏的同时将Excel(2003)工作簿打印为pdf,则打印机的全名为"Nexx上的Adobe PDF:",其中xx是两位数....并且根据您尝试使用的计算机而有所不同.
我已经使用Excel.Interop编写了一个C#控制台应用程序(我强烈反对其他任何人开始这条路走向地狱),这会打开一系列电子表格.它在每个中运行一个宏,保存,打印为pdf,然后将pdf移动到共享驱动器上的报告文件夹.
我面临的问题是,每次安装Acrobat似乎都会为PDF打印机选择一个随机端口号...我无法弄清楚如何获得它.
到目前为止,我已经尝试过像这样使用Win32_Printer类
var searcher = new ManagementObjectSearcher( @"SELECT * FROM Win32_Printer" );
foreach ( ManagementObject printer in searcher.Get() )
{
if ( Regex.IsMatch( printer["Name"].ToString(), @"(adobe|pdf)", RegexOptions.IgnoreCase ) )
{
//printer["Name"]; => "Adobe PDF"
//printer["PortName"] => "my documents/*.pdf"
foreach ( PropertyData pd in printer.Properties )
{
Console.WriteLine(string.Format("{0}, {1}", pd.Name, pd.Value));
}
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我还在System.Drawing.Printing类中探讨过.该PrinterSettings.InstalledPrinters会给你的打印机"的Adobe PDF"的名字,但我无法弄清楚如何获得端口信息.
如果我只将"Adobe PDF"传递给excel interop PrintOut()方法,它有时会工作,有时会因"文档无法打印"而失败......我无法弄清楚原因.
如果我使用适当的x值传递硬编码的"Nexx上的Adobe PDF:",它每次都有效.
如果我尝试所有可能的变化,Excel可以帮助打印到默认打印机.我没有更改默认打印机的选项(安全策略限制)
有人能指出我正确拉动打印机端口的代码吗?
我正在尝试将数据从DataSet传输到Excel工作簿.不幸的是,我需要更多的控制,只需通过ADO.NET链接到Excel并使用标准SQL来选择和插入数据,所以我使用excel互操作.
我的原始算法涉及循环遍历数据集的所有表/行/项,并Formula在Excel中单独设置每个单元格.这很有效,但转移所有数据需要将近半分钟.
我决定尝试不同的解决方案:每个表格转换为制表符分隔字符串(使用的组合StringBuilder和string.Join(),复制字符串到剪贴板,并使用互操作调用Excel上粘贴命令Worksheet对象.
这也有效,并将时间缩短了50%以上,但我对使用剪贴板传输数据有点偏执.如果用户在传输过程中开始执行涉及剪贴板的其他事情,会发生什么?我还想知道如果我可以直接粘贴字符串而不是必须使用剪贴板作为中介,它是否会更快.
那么,这就是我的问题...... 是否有一些命令允许我直接从C#字符串中一次性"粘贴"一个数据块,而无需使用剪贴板?
Excel Interop正在从已处理的文件中删除图像.
我正在使用Excel Interop,没有第三方组件(我知道).工作流程是 - 创建文件(模板)的副本(目标),填充单元格,更改单选按钮状态
在我的开发机器上,目标文件看起来很棒 - 所有内容都已填充,图像存在.注意:在我的开发机器上,我正在运行VS2010 IDE中的代码.
在生产机器上 - 一切都已填充,但图像不存在.相反,会出现以下错误: NB:在生产计算机上,它作为服务运行,具有本地服务帐户.
"在文件中找不到关系ID为rId1的图像部分"

通过以下代码打开整个工作簿:
var workbook = workbooks.Open(targetPath
0, false, 5, Type.Missing, Type.Missing, false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
Run Code Online (Sandbox Code Playgroud)
请注意,代码中不会处理带有图像的工作表.
工作簿(和个人工作表)受到保护.但是,受保护的模板在开发中正确处理,但不在生产中.我不认为保护与它有任何关系(但谁知道,对吧?这是Interop.呃).
该文件由另一方创建,所有组件(即图像)都位于.xslm结构中,而不是作为另一个服务器的链接.
我已经验证图像在模板文件中的生产计算机上可见,但不在处理过的文件中.
为了确认这不是在制作中打开文件的问题,我通过电子邮件发送了一份副本,图像仍然不存在.
我还确认,在我的开发机器上,处理过的文件确实有可见的图像.
我不保护工作表,并解压缩文件结构..jpg文件确实不存在于生产机器的已处理目标中.
还有一个注意事项 - Office 2010安装在我的开发计算机上,但是Office 2007安装在生产计算机上.结果,我正在使用Office 12 Interop.在任一环境中都不会生成运行时错误.
我正在使用Interop(而不是OpenXml库),因为存在必须填充的ActiveX控件.但请注意,没有任何ActiveX控件存在任何问题 - 它们工作正常.它只是从处理过的文件中消失的图像文件(它们在模板文件中呈现得很好).
更新说明:还有其他四个图像文件,全部.emf在不同的工作表上; 他们都被剥夺了.
对于当前代码:
String currentPath = Directory.GetCurrentDirectory();
OpenFileDialog op = new OpenFileDialog();
op.InitialDirectory = currentPath;
if (op.ShowDialog() == DialogResult.OK)
currentPath = op.FileName;
else
{
toolStripStatusLabel1.Text = "Failed to Load Workbook";
toolStripStatusLabel1.Visible = true;
}
Workbook wb = new Workbook(excel.Workbooks.Open(currentPath));
Run Code Online (Sandbox Code Playgroud)
我收到错误:
System.Runtime.InteropServices.COMException未处理Message =检索具有CLSID {00020819-0000-0000-C000-000000000046}的组件的COM类工厂因以下错误而失败:80040154类未注册(HRESULT异常:0x80040154(REGDB_E_CLASSNOTREG) )).Source = mscorlib ErrorCode = -2147221164
我想要的只是一个预定义的工作簿来添加工作表
我找到了一些使用Style属性的代码,Microsoft.Office.Interop.Excel.Worksheet.Cells[x,y]但它在我的Visual Studo代码编辑器中被视为一个对象:
Workbook wb = new Application.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = wb.Sheets[1];
ws.Cells[x,y] is simply treated as an object so how can I use its Style property?
Run Code Online (Sandbox Code Playgroud)
我正在使用Microsoft Excel 15.0对象库(与Microsoft Office 2013一起使用).那有关系吗?
你能解释一下吗?谢谢.
我有一些代码打开xls工作簿;
Excel.Workbooks workBooks;
workBooks = excelApp.Workbooks;
workbook = workBooks.Open(sourceFilePath + sourceFileName + ".xls");
Run Code Online (Sandbox Code Playgroud)
然后我得到工作表;
worksheets = workbook.Worksheets;
worksheet = worksheets.get_Item("Standard");
Run Code Online (Sandbox Code Playgroud)
然后我将文件保存为csv;
worksheet.SaveAs(sourceFilePath + sourceFileName + ".csv", Excel.XlFileFormat.xlCSVWindows, Type.Missing, Type.Missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing);
Run Code Online (Sandbox Code Playgroud)
然后我尝试关闭工作簿;
Marshal.FinalReleaseComObject(worksheet);
Marshal.FinalReleaseComObject(worksheets);
workbook.Close();
Marshal.FinalReleaseComObject(workbook);
Run Code Online (Sandbox Code Playgroud)
但是,每次进入line workbook.Close()时,系统都会停止.
如果我不执行SaveAs,那么工作簿就会关闭.
如何关闭工作簿?
编辑
查看任务管理器向我显示Excel.exe仍在运行.关闭它会在我的代码中产生错误.
编辑2
我已经看过引用的SO帖子,但它没有解决问题.
我正在尝试确定是否打开了运行特定文件的Excel实例,如果是这样,请附加到它以便我可以控制该实例.
我四处搜寻,我得到的大部分内容来自这个问题.它提到了另一个网站,但遗憾的是它已经死了,所以我无法阅读它.
到目前为止我的代码是;
//Is Excel open?
if (Process.GetProcessesByName("EXCEL").Length != 0)
{
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
//Find the exact Excel instance
if (process.ProcessName.ToString() == "EXCEL" && process.MainWindowTitle == ("Microsoft Excel - " + fileName))
{
//Get the process ID of that instance
int processID = (int)Process.GetProcessById(process.Id).MainWindowHandle;
//Attach to the instance...
Excel.Application existingExcel = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject(process.Id);
}
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经设法获取了我想要附加的实例的进程ID,但是在使用该ID时我已经迷失了.
关于如何进行的任何想法?
我创建了一个简单的库存界面,它将从我的界面上的数据网格视图中访问和显示数据,然后通过按钮点击将信息发送到Excel.此部分根据需要工作,但我想在发送信息后删除未使用的列和行.我目前正在使用VS 2015.我无法弄清楚要添加什么来实现这一目标.
//send to excel
private void btnExport_Click(object sender, EventArgs e)
{
ActiveControl = txtSerial;
// creating Excel Application
Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
// creating new WorkBook within Excel application
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
// creating new Excelsheet in workbook
Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
// see the excel sheet behind the program
app.Visible = true;
// get the reference of first sheet. By default its name is Sheet1.
// store its reference to worksheet
worksheet = workbook.Sheets["Sheet1"];
worksheet = …Run Code Online (Sandbox Code Playgroud) c# ×10
excel-interop ×10
excel ×5
interop ×2
automation ×1
excel-2007 ×1
excel-2010 ×1
excel-vba ×1
marshalling ×1
pdf ×1
printing ×1
vba ×1
vsto ×1
worksheet ×1