在 C# 中创建和使用 Excel 文件 - Unity
Posted
技术标签:
【中文标题】在 C# 中创建和使用 Excel 文件 - Unity【英文标题】:Create and use excel file in c# - Unity 【发布时间】:2015-04-27 18:13:42 【问题描述】:我尝试将 Unity3D 应用程序中的一些数据写入 Excel 文件。我创建了以下函数:
void WriteToExcel(int i, decimal time, decimal speed, int hr)
string file = "newdoc.xls";
Workbook workbook = new Workbook();
Worksheet worksheet = new Worksheet("First Sheet");
worksheet.Cells[i, 0] = new Cell(i);
worksheet.Cells[i, 1] = new Cell(time);
worksheet.Cells[i, 2] = new Cell(speed);
worksheet.Cells[i, 3] = new Cell(hr);
worksheet.Cells.ColumnWidth[0, 1] = 3000;
workbook.Worksheets.Add(worksheet);
workbook.Save(file);
当我尝试运行应用程序时,我收到以下错误:
未处理的异常:System.TypeLoadException:无法加载类型 来自程序集“ExcelLibrary”的“ExcelLibrary.SpreadSheet.CellStyle”, 版本=1.0.0.0,文化=中性,PublicKeyToken=null'。
at(包装器托管到本机) System.Reflection.MonoMethodInfo:get_method_info (intptr,System.Reflection.MonoMethodInfo&)
在 System.Reflection.MonoMethodInfo.GetMethodInfo(IntPtr 句柄) [0x00000] 在 :0
在 System.Reflection.MonoMethodInfo.GetAttributes(IntPtr 句柄) [0x00000] 在 :0
在 System.Reflection.MonoMethod.get_Attributes()[0x00000] 中 :0
在 System.Reflection.MethodBase.get_IsVirtual() [0x00000] 中 :0
在 Mono.CSharp.MemberCache.AddMethods (BindingFlags bf, System.Type 类型)[0x00000] in :0
在 Mono.CSharp.MemberCache.AddMethods (System.Type 类型) [0x00000] 中 :0
在 Mono.CSharp.MemberCache..ctor (IMemberContainer 容器) [0x00000] 在 :0
在 Mono.CSharp.TypeHandle..ctor (System.Type 类型) [0x00000] 中 :0
在 Mono.CSharp.TypeHandle.GetTypeHandle (System.Type t) [0x00000] 中 :0
在 Mono.CSharp.TypeHandle.GetMemberCache (System.Type t) [0x00000] 中 :0
在 Mono.CSharp.TypeManager.MemberLookup_FindMembers (System.Type t, MemberTypes mt、BindingFlags bf、System.String 名称、System.Boolean& used_cache) [0x00000] in :0
在 Mono.CSharp.TypeManager.RealMemberLookup (System.Type invocation_type,System.Type qualifier_type,System.Type queried_type, MemberTypes mt、BindingFlags original_bf、System.String 名称、IList 几乎匹配)[0x00000] 在:0
在 Mono.CSharp.TypeManager.MemberLookup (System.Type invocation_type, System.Type qualifier_type, System.Type queried_type, MemberTypes mt, BindingFlags original_bf、System.String 名称、IList 几乎匹配) [0x00000] 在 :0
在 Mono.CSharp.IndexerAccess+Indexers.GetIndexersForTypeOrInterface (System.Type caller_type, System.Type lookup_type) [0x00000] in :0
在 Mono.CSharp.IndexerAccess+Indexers.GetIndexersForType (System.Type caller_type, System.Type lookup_type) [0x00000] in :0
在 Mono.CSharp.IndexerAccess.ResolveAccessor (Mono.CSharp.ResolveContext ec,Mono.CSharp.Expression right_side) [0x00000] 在 :0
在 Mono.CSharp.IndexerAccess.DoResolveLValue (Mono.CSharp.ResolveContext ec,Mono.CSharp.Expression right_side) [0x00000] 在 :0
在 Mono.CSharp.ElementAccess.DoResolveLValue (Mono.CSharp.ResolveContext ec,Mono.CSharp.Expression right_side) [0x00000] 在 :0
在 Mono.CSharp.Expression.ResolveLValue (Mono.CSharp.ResolveContext ec, Mono.CSharp.Expression right_side) [0x00000] in :0
在 Mono.CSharp.Assign.DoResolve (Mono.CSharp.ResolveContext ec) [0x00000] 在 :0
在 Mono.CSharp.SimpleAssign.DoResolve (Mono.CSharp.ResolveContext ec) [0x00000] 在 :0
在 Mono.CSharp.Expression.Resolve (Mono.CSharp.ResolveContext ec, ResolveFlags flags) [0x00000] in :0
在 Mono.CSharp.Expression.Resolve (Mono.CSharp.ResolveContext ec) [0x00000] 在 :0
在 Mono.CSharp.ExpressionStatement.ResolveStatement (Mono.CSharp.BlockContext ec) [0x00000] in :0
在 Mono.CSharp.StatementExpression.Resolve (Mono.CSharp.BlockContext ec) [0x00000] in :0
在 Mono.CSharp.Block.Resolve (Mono.CSharp.BlockContext ec) [0x00000] 在:0
在 Mono.CSharp.ToplevelBlock.Resolve (Mono.CSharp.FlowBranching 父,Mono.CSharp.BlockContext rc,Mono.CSharp.ParametersCompiled ip, IMethodData md) [0x00000] in :0
谁能告诉我为什么我会得到这个异常?因为我觉得我的程序写的不错.. 谢谢。
【问题讨论】:
您可以考虑使用 Microsoft Office 互操作库以外的库。 EPPlus、NPOI 或 Open Office XML SDK 将是不错的选择。 我相信您遇到了异常,因为您使用的 DLL 文件与 Mono 不兼容。您需要找到要使用的 Mono 兼容库,它不是 Office Interop Libraries,不确定 EPPlus,但可能是 Open Office XML SDK。 【参考方案1】:我通常使用电子表格 XML。相应地替换#ColCount,#RowCount(通过填充行数来慷慨,+5 左右否则你会得到一个错误),#Headers 和#Rows 使用 for 循环使用适当的 Rows:即
标题
<Row>
<Cell><Data ss:Type="String">s</Data></Cell>
<Cell><Data ss:Type="String">d</Data></Cell>
<Cell><Data ss:Type="String">f</Data></Cell>
<Cell><Data ss:Type="String">h</Data></Cell>
<Cell><Data ss:Type="String">j</Data></Cell>
<Cell><Data ss:Type="String">j</Data></Cell>
</Row>
行数据
<Row>
<Cell><Data ss:Type="Number">5</Data></Cell>
<Cell><Data ss:Type="Number">4</Data></Cell>
<Cell><Data ss:Type="Number">3</Data></Cell>
<Cell><Data ss:Type="Number">2</Data></Cell>
<Cell><Data ss:Type="Number">1</Data></Cell>
<Cell><Data ss:Type="Number">0</Data></Cell>
</Row>
电子表格 XML 模板
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
<Styles>
<Style ss:ID="Default" ss:Name="Normal">
<Alignment ss:Vertical="Bottom"/>
<Borders/>
<Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/>
<Interior/>
<NumberFormat/>
<Protection/>
</Style>
</Styles>
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="#ColCount" ss:ExpandedRowCount="#RowCount" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
<#Headers>
<#RowData>
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.3"/>
<Footer x:Margin="0.3"/>
<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</PageSetup>
<Selected/>
<Panes>
<Pane>
<Number>3</Number>
<RangeSelection>R1C1:R2C6</RangeSelection>
</Pane>
</Panes>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="Sheet2">
<Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.3"/>
<Footer x:Margin="0.3"/>
<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</PageSetup>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
<Worksheet ss:Name="Sheet3">
<Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
</Table>
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
<PageSetup>
<Header x:Margin="0.3"/>
<Footer x:Margin="0.3"/>
<PageMargins x:Bottom="0.75" x:Left="0.7" x:Right="0.7" x:Top="0.75"/>
</PageSetup>
<ProtectObjects>False</ProtectObjects>
<ProtectScenarios>False</ProtectScenarios>
</WorksheetOptions>
</Worksheet>
</Workbook>
然后另存为文件名.xls。让用户处理格式化。无需额外的库或安装 Excel。
愉快的编码。 :)
【讨论】:
以上是关于在 C# 中创建和使用 Excel 文件 - Unity的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中创建和初始化双精度的 SAFEARRAY 以传递给 C#