我正在编写一个与excel文件一起使用的应用程序.我需要一个删除工作表的功能.我必须使用程序集Microsoft.Office.Interop.Excel.dll.
它在开发人员计算机上运行良好,但当我尝试在服务器上部署它时,我收到一个错误:
无法加载文件或程序集'office,Version = 14.0.0.0,Culture = neutral,PublicKeyToken = 71e9bce111e9429c'或其中一个依赖项
我知道在计算机上未安装MS Office时会出现问题.客户不希望以任何价格在服务器上安装和购买MS Office.
我按照此处的建议在开发人员计算机上安装"Redistributable Primary Interop Assemblies":http://forums.asp.net/t/1530230.aspx/1 并再次编译我的项目.
代码示例:
public bool DeleteSheet(string tableName)
{
Excel.Application app = null;
Excel.Workbooks wbks = null;
Excel._Workbook _wbk = null;
Excel.Sheets shs = null;
bool found = false;
try
{
app = new Excel.Application();
app.Visible = false;
app.DisplayAlerts = false;
app.AlertBeforeOverwriting = false;
wbks = app.Workbooks;
_wbk = wbks.Add(xlsfile);
shs = _wbk.Sheets;
int nSheets = shs.Count;
for (int i = 1; i …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,它遍历某些目录中的每个文件,并对这些文件执行一些操作.其中,我必须检索文件大小和修改此文件的日期.
有些文件全名(目录+文件名)太长,我无法使用.NET Framework FileInfo,限制为MAX_PATH(260个字符).许多Web资源建议通过P/Invoke使用本机Win32函数来访问名称太长的文件.
目前,Win32函数似乎出现了完全相同的问题.例如,对于GetFileAttributesEx270字节的路径,(kernel32.dll)失败,Win32错误3 ERROR_PATH_NOT_FOUND.
可以从Notepad2成功打开同一个文件并使用Windows资源管理器成功显示(但Visual Studio 2010例如由于259个字符限制¹而无法打开它).
当文件路径长度为270个字符时,如何才能访问文件?
笔记:
删除或忽略文件路径长度超过259个字符的文件不是解决方案.
我正在寻找仅与Unicode兼容的解决方案.
该应用程序将在安装了.NET Framework 4的Windows 2008/Vista或更高版本下运行.
¹令人惊讶的是,Microsoft Word 2007失败了,在没有任何软盘驱动器的计算机上抱怨"软盘太小",或者在剩下4 GB RAM时"RAM内存很低",或者最后那个"防病毒软件[...]需要更新".他们有一天会停止显示至少在像Microsoft Office这样的关键产品中出现如此愚蠢无意义的错误吗?
如何将C#DLL转换为可由VB6应用程序使用的COM互操作DLL?
我想知道我可以做些什么来提高Excel自动化的性能,因为如果你在工作表中有很多事情,它可能会很慢......
这里有一些我发现自己:
ExcelApp.ScreenUpdating = false - 关闭重绘屏幕
ExcelApp.Calculation = Excel.XlCalculation.xlCalculationManual - 关闭计算引擎,以便Excel在单元格值更改时不会自动重新计算(在完成后将其重新打开)
减少对Worksheet.Cells.Item(row, col)和的调用Worksheet.Range- 我不得不轮询数百个单元格以找到我需要的单元格.实现一些单元格位置的缓存,将执行时间从大约40秒减少到大约5秒.
什么样的互操作会对性能造成严重影响,应该避免?你还能做些什么来避免不必要的处理?
我听说有些人在一个项目中用多种语言编程.我无法想象语言如何相互作用.
我的意思是没有类似的Java方法
myProgram.callCfunction(parameters);
Run Code Online (Sandbox Code Playgroud)
永远不会发生或我错了吗?
使用以下代码运行Excel加载项时出现"HRESULT:0x800A03EC"错误:
Excel.Range rng = ActiveSheet.Cells[x, y] as Excel.Range;
string before = rng.Value2;
string cleanV = System.Text.RegularExpressions.Regex.Replace(before, @"\s+", "");
rng.set_Value(cleanV);
Run Code Online (Sandbox Code Playgroud)
当错误发生时,X和Y设置为1,因此不会违反Excel范围.我进行了广泛的搜索并尝试了多种设置单元格值的方法(例如,Cells [x,y],range.set_Value()),但是为什么会发生这种错误以及如何避免它.
任何帮助是极大的赞赏.
以下是例外情况:
System.Runtime.InteropServices.COMException was unhandled by user code
HResult=-2146827284
Message=Exception from HRESULT: 0x800A03EC
Source=""
ErrorCode=-2146827284
StackTrace:
at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
at Microsoft.Office.Interop.Excel.Range.set_Value(Object RangeValueDataType, Object value)
at ImportValidation.ThisAddIn.removeAnySpaces(Int32 x, Int32 y) in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\ThisAddIn.cs:line 354
at ImportValidation.ThisAddIn.ReadHeaders(Hashtable columnAddress) in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\ThisAddIn.cs:line 123
at ImportValidation.ThisAddIn.mapColumns() in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\ThisAddIn.cs:line 493
at ImportValidation.Ribbon1.button6_Click(Object …Run Code Online (Sandbox Code Playgroud) 我有这个带有String值的枚举,它将用于告诉API方法记录服务器消息具有什么样的服务器性.我正在使用Swift 1.2,因此枚举可以映射到Objective-C
@objc enum LogSeverity : String {
case Debug = "DEBUG"
case Info = "INFO"
case Warn = "WARN"
case Error = "ERROR"
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误
@objc enum raw type String不是整数类型
我没有设法找到任何说只有整数可以从Swift转换为Objective-C的地方.是这样的吗?如果是这样,有没有人有任何关于如何在Objective-C中提供这样的东西的最佳实践建议?
我有一个C lib,想从C#应用程序调用这个库中的函数.我尝试通过添加C lib文件作为链接器输入并将源文件添加为附加依赖项来在C lib上创建C++/CLI包装器.
有没有更好的方法来实现这一点,因为我不确定如何将C输出添加到c#应用程序.
我的C代码 -
__declspec(dllexport) unsigned long ConnectSession(unsigned long handle,
unsigned char * publicKey,
unsigned char publicKeyLen);
Run Code Online (Sandbox Code Playgroud)
我的CPP包装 -
long MyClass::ConnectSessionWrapper(unsigned long handle,
unsigned char * publicKey,
unsigned char publicKeyLen)
{
return ConnectSession(handle, publicKey, publicKeyLen);
}
Run Code Online (Sandbox Code Playgroud) 基本上我需要做的就是这个
FileChannel.MapMode.READ_ONLY
Run Code Online (Sandbox Code Playgroud)
我试着做的很明显
(.. FileChannel MapMode READ_ONLY)
Run Code Online (Sandbox Code Playgroud)
但最终会抛出异常
java.lang.NoSuchFieldException: MapMode
Run Code Online (Sandbox Code Playgroud)
甚至/在interop文档中为访问静态字段指定的表示法也会产生相同的异常
(. (FileChannel/MapMode) READ_ONLY)
Run Code Online (Sandbox Code Playgroud) 我需要一些澄清.我有一个使用Crystal Reports的Reportwriter dll.它是用VB6编写的.我必须将这个dll添加到我的asp.net项目中,它创建一个interop dll.
根据我的理解,interop dll作为中介,以便我的.net代码可以与Reportwriter dll通信.
那么我注册interop dll还是注册原始dll?