有关释放COM对象和垃圾收集的SO有很多问题,但我没有找到具体解决这个问题的任何问题.
在释放COM对象(在本例中特别是Excel Interop)时,我应该以什么顺序释放引用并调用垃圾收集?
在某些地方(比如这里),我看到了这个:
Marshall.FinalReleaseComObject(obj);
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
在其他人(如这里)这:
GC.Collect();
GC.WaitForPendingFinalizers();
Marshall.FinalReleaseComObject(obj);
Run Code Online (Sandbox Code Playgroud)
或者不重要,我什么都不担心?
我试图替换从Excel电子表格检索的字符串中的一些不良字符.原因是我们的Oracle数据库使用的是WE8ISO8859P1字符集,它没有定义Excel"帮助"在文本中插入的几个字符(引号,em和en破折号等)因为我无法控制数据库或者如何创建Excel电子表格我需要用其他东西替换字符.
我将单元格内容检索为字符串,因此:
string s = xlRange.get_Range("A1", Missing.Value).Value2.ToString().Trim();
Run Code Online (Sandbox Code Playgroud)
在Visual Studio的Text Visualiser中查看字符串会显示要完整并正确检索的文本.接下来我尝试替换一个不需要的字符(在这种情况下是右边的卷曲引号):
s = Regex.Replace(s, "\u0094", "\u0022");
Run Code Online (Sandbox Code Playgroud)
但它没有任何作用(Text Visualiser显示它仍然存在).为了尝试验证我想替换的角色实际上在那里,我试过:
bool a = s.Contains("\u0094");
Run Code Online (Sandbox Code Playgroud)
但它返回false.然而:
bool b = s.Contains("”");
Run Code Online (Sandbox Code Playgroud)
返回true.
我对.NET中的字符串的理解(有点缺乏)是它们用UTF-16编码,而Excel可能使用ANSI.那么这是否意味着我需要更改Excel中出现的文本编码?或者我在这里做错了什么?任何建议将不胜感激.我已经阅读并重新阅读了我能找到的关于Unicode和编码的所有文章,但我仍然没有更聪明.
假设我有一个包含五列的DataTable.我很好奇为什么以下工作:
dt.Columns.Add("Blah").SetOrdinal(5);
Run Code Online (Sandbox Code Playgroud)
但以下抛出ArgumentOutOfRangeException:
dt.Columns.Add("Blah").SetOrdinal(dt.Columns.Count);
Run Code Online (Sandbox Code Playgroud)
我也试过了
dt.Columns.Add("Blah").SetOrdinal(dt.Columns.Count - 1);
Run Code Online (Sandbox Code Playgroud)
哪个有效,但我不完全确定原因.它是否与在SetOrdinal执行之前添加的列有关,从而增加了超出列范围的计数?
我想用C#为Windows Phone 8应用程序创建一个Excel文件,但我找不到办法.
我用OpenXml试了一下.但是,当我尝试执行代码时,我收到此错误:
类型'System.IO.Packaging.Package'在未引用的程序集中定义.您必须添加对程序集'WindowsBase,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'的引用.
这是代码:
public static void CreateSpreadsheetWorkbook(string filepath)
{
// Create a spreadsheet document by supplying the filepath.
// By default, AutoSave = true, Editable = true, and Type = xlsx.
SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filepath, DocumentFormat.OpenXml.SpreadsheetDocumentType.MacroEnabledWorkbook);
// Add a WorkbookPart to the document.
WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
workbookpart.Workbook = new Workbook();
// Add a WorksheetPart to the WorkbookPart.
WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());
// Add Sheets to …Run Code Online (Sandbox Code Playgroud) 我有一个enum以下面的方式声明(但有更多的选项 - 约15左右),因为我想要一个简单的方法来定义所有选项,而不必明确列出它们.
[Flags]
enum Options
{
Option1 = 1,
Option2 = 2,
Option3 = 4,
Option4 = 8,
AllOptions = 15
}
Run Code Online (Sandbox Code Playgroud)
所以,而不是说
Options foo = Options.Option1 | Options.Option2 | Options.Option3 |... ad nauseum
Run Code Online (Sandbox Code Playgroud)
我可以说
Options foo = Options.AllOptions;
Run Code Online (Sandbox Code Playgroud)
这是明智的吗?或者是否有更好的方法可以为变量提供所有可用选项而无需明确列出它们?
我有这样的enum定义:
[Flags]
public enum NodeLevel
{
Root = 1,
GroupLevel = 2,
DeptLevel = 4,
ClassLevel = 8,
SubclassLevel = 16
}
Run Code Online (Sandbox Code Playgroud)
我已将其定义为Flags可以对它们执行按位操作.现在我需要能够从关卡中"减去1",以便在给定特定级别时我可以检索下一级别.例如,一个对象包含一个值,NodeLevel.ClassLevel我需要发送NodeLevel.DeptLevel给一个方法.
既然NodeLevel newLevel = currentLevel - 1;不起作用,有没有人建议如何实现这一目标?我想这是荒谬的简单但我的大脑此刻不会想到它.
我正在使用.NET 2.0.