标签: openxml-sdk

读取Excel文件的最佳方法(.xls/.xlsx)

我知道有不同的方法来读取Excel文件:

  • Iterop
  • Oledb
  • Open Xml SDK

兼容性不是问题,因为程序将在受控环境中执行.

我的要求:
将文件读取到DataTable/ CUstom Entities(我不知道如何为对象创建动态属性/字段[列名将在Excel文件中变化])

用于DataTable/Custom Entities使用其数据执行某些操作.

更新DataTable操作结果

把它写回去excel file.

哪个更简单.

如果可能的话,请告诉我自定义实体(动态地向对象添加属性/字段)

c# oledb excel excel-interop openxml-sdk

65
推荐指数
5
解决办法
20万
查看次数

打开xml excel读取单元格值

我正在使用Open XML SDK打开Excel xlsx文件,并尝试读取每个工作表中位置A1的单元格值.我使用以下代码:

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(openFileDialog1.FileName, false))
{
    var sheets = spreadsheetDocument.WorkbookPart.Workbook.Descendants<Sheet>();

    foreach (Sheet sheet in sheets)
    {
        WorksheetPart worksheetPart = (WorksheetPart)spreadsheetDocument.WorkbookPart.GetPartById(sheet.Id);
        Worksheet worksheet = worksheetPart.Worksheet;

        Cell cell = GetCell(worksheet, "A", 1);

        Console.Writeline(cell.CellValue.Text);
     }
}

private static Cell GetCell(Worksheet worksheet, string columnName, uint rowIndex)
{
     Row row = GetRow(worksheet, rowIndex);

     if (row == null)
         return null;

     return row.Elements<Cell>().Where(c => string.Compare
               (c.CellReference.Value, columnName +
               rowIndex, true) == 0).First();
}

// Given a worksheet and a row index, return …
Run Code Online (Sandbox Code Playgroud)

c# openxml openxml-sdk

47
推荐指数
3
解决办法
7万
查看次数

阅读Excel Open XML忽略了空白单元格

我在这里使用公认的解决方案将excel表转换为数据表.如果我有"完美"数据,这可以正常工作,但如果我的数据中间有一个空白单元格,那么它似乎会在每列中放入错误的数据.

我想这是因为在下面的代码中:

row.Descendants<Cell>().Count()
Run Code Online (Sandbox Code Playgroud)

是填充单元格的数量(不是所有列)AND:

GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i));
Run Code Online (Sandbox Code Playgroud)

似乎找到下一个填充的单元格(不一定是该索引中的内容)所以如果第一列为空并且我调用ElementAt(0),它将返回第二列中的值.

这是完整的解析代码.

DataRow tempRow = dt.NewRow();

for (int i = 0; i < row.Descendants<Cell>().Count(); i++)
{
    tempRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i));
    if (tempRow[i].ToString().IndexOf("Latency issues in") > -1)
    {
        Console.Write(tempRow[i].ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

datatable excel openxml openxml-sdk

42
推荐指数
4
解决办法
4万
查看次数

什么表明Office Open XML Cell包含日期/时间值?

我正在使用Office Open XML SDK读取.xlsx文件,并对阅读日期/时间值感到困惑.我的一个电子表格有此标记(由Excel 2010生成)

<x:row r="2" spans="1:22" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <x:c r="A2" t="s">
    <x:v>56</x:v>
  </x:c>
  <x:c r="B2" t="s">
    <x:v>64</x:v>
  </x:c>
  .
  .
  .
  <x:c r="J2" s="9">
    <x:v>17145</x:v>
  </x:c>
Run Code Online (Sandbox Code Playgroud)

单元格J2具有日期序列值和样式属性s="9".但是,Office Open XML规范称9对应于后面的超链接.这是ECMA-376第4版第499页第1部分 - 基础和标记语言参考 .pdf的屏幕截图.

替代文字

规范中包含的presetCellStyles.xml文件也将builtinId9称为后续超链接.

<followedHyperlink builtinId="9">
Run Code Online (Sandbox Code Playgroud)

规范中的所有样式都只是可视化格式样式,而不是数字样式.定义的数字样式在哪里?如何区分样式引用s="9"与指示单元格格式(可视)样式与数字样式?

显然,我正在寻找错误的地方,以匹配单元格上的样式与其数字格式.哪里是找到这些信息的合适地点?

excel openxml openxml-sdk

42
推荐指数
3
解决办法
4万
查看次数

使用c#中的Open Xml SDK将DataTable导出到Excel

对不起我的英文请.我是开放式xml sdk的新手.我的程序能够将一些数据和DataTable导出到Excel文件(模板)在模板中,我将数据插入到一些占位符中.它的工作非常好,但我也需要插入一个DataTable ...我的示例代码:

using (Stream OutStream = new MemoryStream())
{
    // read teamplate
    using (var fileStream = File.OpenRead(templatePath))
        fileStream.CopyTo(OutStream);

    // exporting
    Exporting(OutStream);

    // to start
    OutStream.Seek(0L, SeekOrigin.Begin);

    // out
    using (var resultFile = File.Create(resultPath))
        OutStream.CopyTo(resultFile);
Run Code Online (Sandbox Code Playgroud)

下一个导出方法

private void Exporting(Stream template)
{
    using (var workbook = SpreadsheetDocument.Open(template, true, new OpenSettings                          { AutoSave = true }))
    {
        // Replace shared strings
        SharedStringTablePart sharedStringsPart = workbook.WorkbookPart.SharedStringTablePart;
        IEnumerable<Text> sharedStringTextElements = sharedStringsPart.SharedStringTable.Descendants<Text>();

        DoReplace(sharedStringTextElements);
        // Replace inline strings
        IEnumerable<WorksheetPart> worksheetParts = workbook.GetPartsOfType<WorksheetPart>();

        foreach (var worksheet in …
Run Code Online (Sandbox Code Playgroud)

c# excel openxml openxml-sdk

41
推荐指数
3
解决办法
11万
查看次数

使用Open XML从C#中的Excel到DataTable

我正在使用Visual Studio 2008,我需要DataTable使用Open XML SDK 2.0从Excel工作表创建一个.我需要使用带有工作表第一行的DataTable列创建它,并使用其余值完成它.

有没有人有一个示例代码或链接可以帮助我这样做?

c# openxml import-from-excel openxml-sdk

38
推荐指数
3
解决办法
6万
查看次数

将修改后的WordprocessingDocument保存到新文件中

我正在尝试打开W​​ord文档,更改一些文本,然后将更改保存到新文档.我可以使用下面的代码完成第一项,但我无法弄清楚如何将更改保存到新文档(指定路径和文件名).

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using DocumentFormat.OpenXml.Packaging;
using System.IO;

namespace WordTest
{
class Program
{
    static void Main(string[] args)
    {
        string template = @"c:\data\hello.docx";
        string documentText;

        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(template, true))
        {
            using (StreamReader reader = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
            {
                documentText = reader.ReadToEnd();
            }


            documentText = documentText.Replace("##Name##", "Paul");
            documentText = documentText.Replace("##Make##", "Samsung");

            using (StreamWriter writer = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
            {
                writer.Write(documentText);
            }
        }
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

我是一个完全的初学者,请原谅基本问题!

c# office-2007 openxml openxml-sdk

36
推荐指数
3
解决办法
4万
查看次数

如何在Mono2.10上包含DocumentFormat.OpenXml.dll的引用?

我正在使用C#.net Windows桌面应用程序.我也希望与其他平台一起运行这些应用程序.所以,我使用Mono 2.10作为交叉编译器.运行时,意外地我的应用程序被终止,说错误消息像

错误:无法打开所选文件夹.
无法加载文件或程序集"DocumentFormat.OpenXml.dll,version = 2.0.5022.0,culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其中一个依赖项.

我不知道这里有什么问题...我在c:\ program files\open xml sdk\v2\lib\DocumentFormat.OpenXml.dll上安装了openxml sdk2.0.

并将我的应用程序eXe放在同一个地方进行测试......

请指导我解决这个问题......

c# mono moma openxml-sdk

31
推荐指数
4
解决办法
10万
查看次数

使用OpenXml创建分页符

我使用OpenXml创建Word文档,其中包含简单文本和本文下的一些表格.如何强制使用此文本的Paragraph始终显示在新页面上?也许这一段应该是一些标题,但我不知道该怎么做.

谢谢

.net c# openxml openxml-sdk

30
推荐指数
2
解决办法
2万
查看次数

使用open xml sdk从xlsx读取日期

我在其中一个单元格的xlsx文件中有一个格式为"4/5/2011"(月/日/年)的日期.我试图解析文件并在某些类中加载这些数据.

到目前为止,我解析单元格的部分如下所示:

string cellValue = cell.InnerText;
if (cell.DataType != null)
{
    switch (cell.DataType.Value)
    {
        case CellValues.SharedString:
            // get string from shared string table
            cellValue = this.GetStringFromSharedStringTable(int.Parse(cellValue));
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望date可以是cell.DataType.事实是,在使用日期"4/5/2011"解析单元格时,cell.DataType的值为null,单元格的值为"40638",并且它不是共享字符串表的索引.(我之前尝试过这种方法,结果却出现了异常.)

有任何想法吗?谢谢

c# datetime date openxml openxml-sdk

28
推荐指数
3
解决办法
2万
查看次数