在 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的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA从两个日期在表格中创建和添加多行

在 C# 的代码隐藏中创建和发布表单的最佳方法

如何在 C++ 中创建和初始化双精度的 SAFEARRAY 以传递给 C#

在 Excel 中创建和重命名工作表的方法(ws.title 与 wb.create_sheet)

如何以编程方式在 Recurly 中创建和兑换优惠券?

在 Windows Azure 中创建和流式传输复合清单文件