GVKun编程网logo

c# – 如何使用OpenXML SDK将Excel转换为CSV?(openxml格式)

15

关于c#–如何使用OpenXMLSDK将Excel转换为CSV?和openxml格式的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.NetCore使用OpenXML导出、导入Excel、

关于c# – 如何使用OpenXML SDK将Excel转换为CSV?openxml格式的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.Net Core使用OpenXML导出、导入Excel、c# – Excel将SpreadsheetML转换为Open XML(XLSX)、c# – 使用OpenXML SDK将RTF文件的内容嵌入到DOCX文件中、c# – 使用openxml合并excel中的相邻单元格等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

c# – 如何使用OpenXML SDK将Excel转换为CSV?(openxml格式)

c# – 如何使用OpenXML SDK将Excel转换为CSV?(openxml格式)

我需要将Excel(2010)文件转换为csv.目前我正在使用Excel Interop打开和SaveAs csv,这很好用.然而,Interop在我们使用它的environemt中存在一些问题,所以我正在寻找另一种解决方案.

我发现没有互操作的Excel文件的使用方法是使用OpenXML SDK.我一起编写了一些代码来遍历每个工作表中的所有单元格,然后将它们简单地写入CSV中的另一个文件.

我遇到的一个问题是处理空行和单元格.看来,使用此代码,空白行和单元格完全不存在,因此我无法了解它们.有没有通过所有行和单元格,包括空白?

string filename = @"D:\test.xlsx";
string outputDir = Path.GetDirectoryName(filename);
//--------------------------------------------------------

using (SpreadsheetDocument document = SpreadsheetDocument.Open(filename,false))
{

    foreach (Sheet sheet in document.WorkbookPart.Workbook.Descendants<Sheet>())
    {
        WorksheetPart worksheetPart = (WorksheetPart) document.WorkbookPart.GetPartById(sheet.Id);
        Worksheet worksheet = worksheetPart.Worksheet;

        SharedStringTablePart shareStringPart = document.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
        SharedStringItem[] items = shareStringPart.SharedStringTable.Elements<SharedStringItem>().ToArray();

        // Create a new filename and save this file out.
        if (string.IsNullOrWhiteSpace(outputDir))
            outputDir = Path.GetDirectoryName(filename);
        string newFilename = string.Format("{0}_{1}.csv",Path.GetFileNameWithoutExtension(filename),sheet.Name);
        newFilename = Path.Combine(outputDir,newFilename);

        using (var outputFile = File.CreateText(newFilename))
        {
            foreach (var row in worksheet.Descendants<Row>())
            {
                StringBuilder sb = new StringBuilder();
                foreach (Cell cell in row)
                {
                    string value = string.Empty;
                    if (cell.CellValue != null)
                    {
                        // If the content of the first cell is stored as a shared string,get the text
                        // from the SharedStringTablePart. Otherwise,use the string value of the cell.
                        if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
                            value = items[int.Parse(cell.CellValue.Text)].InnerText;
                        else
                            value = cell.CellValue.Text;
                    }

                    // to be safe,always use double quotes.
                    sb.Append(string.Format("\"{0}\",",value.Trim()));
                }
                outputFile.WriteLine(sb.ToString().TrimEnd(','));
            }
        }
    }
}

如果我有以下Excel文件数据:

one,two,three,last,row

我将得到以下CSV(这是错误的):

one,three
last,row

解决方法

//Xlsx to Csv
ConvertXlsxToCsv(@"D:\test.xlsx",@"C:\");

internal static void ConvertXlsxToCsv(string SourceXlsxName,string DestinationCsvDirectory)
{
    try
    {
        using (SpreadsheetDocument document = SpreadsheetDocument.Open(SourceXlsxName,false))
        {

            foreach (Sheet _Sheet in document.WorkbookPart.Workbook.Descendants<Sheet>())
            {
                WorksheetPart _WorksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(_Sheet.Id);
                Worksheet _Worksheet = _WorksheetPart.Worksheet;

                SharedStringTablePart _SharedStringTablePart = document.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
                SharedStringItem[] _SharedStringItem = _SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ToArray();

                if (string.IsNullOrEmpty(DestinationCsvDirectory))
                    DestinationCsvDirectory = Path.GetDirectoryName(SourceXlsxName);
                string newFilename = string.Format("{0}_{1}.csv",Path.GetFileNameWithoutExtension(SourceXlsxName),_Sheet.Name);
                newFilename = Path.Combine(DestinationCsvDirectory,newFilename);

                using (var outputFile = File.CreateText(newFilename))
                {
                    foreach (var row in _Worksheet.Descendants<Row>())
                    {
                        StringBuilder _StringBuilder = new StringBuilder();
                        foreach (Cell _Cell in row)
                        {
                            string Value = string.Empty;
                            if (_Cell.CellValue != null)
                            {
                                if (_Cell.DataType != null && _Cell.DataType.Value == CellValues.SharedString)
                                    Value = _SharedStringItem[int.Parse(_Cell.CellValue.Text)].InnerText;
                                else
                                    Value = _Cell.CellValue.Text;
                            }
                            _StringBuilder.Append(string.Format("{0},Value.Trim()));
                        }
                        outputFile.WriteLine(_StringBuilder.ToString().TrimEnd(','));
                    }
                }
            }
        }
    }
    catch (Exception Ex)
    {
        throw Ex;
    }
}

.Net Core使用OpenXML导出、导入Excel

.Net Core使用OpenXML导出、导入Excel

导出Excel是程序很常用到的功能,.Net Core可以借助Open-XML-SDK来导出Excel。

Open-XML-SDK

open-xml-sdk是是微软开源的项目。Open XML SDK是用于Open XML文档(DOCX, XLSX, and PPTX)的开源类库。它可以:

  • 生成Word,Excel,PPT时有非常好的性能
  • 从XML数据源中填充内容到Word文档中
  • 可将单个Word,Excel,PPT分成多个文件或者将多个合并到一个文件中
  • DOCX => HTML/CSS 和 HTML/CSS => DOCX 提供友好便捷的方式
  • 提取Excel中的数据
  • 用正则表达式查找或者替换DOCX / PPTX中的内容
  • 更新 DOCX / PPTX 中缓存的数据或者嵌入的表格.
  • 文档内容的修改, 例如从文件中删除跟踪的修订或删除不可接受的内容.

依赖 WindowsBase 或 System.IO.Packaging

开源地址:Open-XML-SDK

Nuget:DocumentFormat.OpenXml

Open XML SDK for Office 文档

示例

首先添加Nuget包引用

直接上代码:

static void Main(string[] args)
{
 var spreadsheetDocument = SpreadsheetDocument.Create("F:\\OpenXml.xlsx", SpreadsheetDocumentType.Workbook);
 var workbookpart = spreadsheetDocument.AddWorkbookPart();
 workbookpart.Workbook = new Workbook();
 WorksheetPart worksheetPart = workbookpart.AddNewPart();
 worksheetPart.Worksheet = new Worksheet(new SheetData());
 Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new Sheets());
 Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" };
 sheets.Append(sheet);
 var sheetData = worksheetPart.Worksheet.GetFirstChild();
 for (int i = 0; i < 10; i++)
 {
  Row row = new Row();
  for (int j = 0; j < 10; j++)
  {
   Cell dataCell = new Cell();
   dataCell.CellValue = new CellValue($"{i + 1}行{j + 1}列");
   dataCell.DataType = new EnumValue(CellValues.String);
   row.AppendChild(dataCell);
  }
  sheetData.Append(row);
 }


 workbookpart.Workbook.Save();
 spreadsheetDocument.Close();
}

导出的Excel如图:

读取Excel

读取Excel的代码会相对简单一些:

static void Main(string[] args)
{
 using (SpreadsheetDocument doc = SpreadsheetDocument.Open(@"F:\OpenXml.xlsx", false))
 {
  WorkbookPart wbPart = doc.WorkbookPart;
  Sheet mysheet = (Sheet)doc.WorkbookPart.Workbook.Sheets.ChildElements.FirstOrDefault();
  Worksheet worksheet = ((WorksheetPart)wbPart.GetPartById(mysheet.Id)).Worksheet;
  SheetData sheetData = (SheetData)worksheet.ChildElements.FirstOrDefault();

  foreach (var row in sheetData.ChildElements)
  {
   foreach (var cell in (row as Row).ChildElements)
   {
    var cellValue = (cell as Cell).CellValue;
    if (cellValue != null)
    {
     Console.WriteLine(cellValue.Text);
    }
   }
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:
  • ASP.NET Core 导入导出Excel xlsx 文件实例
  • ASP.NET之Excel下载模板、导入、导出操作
  • Asp.Net使用Npoi导入导出Excel的方法
  • .NET6导入和导出EXCEL

c# – Excel将SpreadsheetML转换为Open XML(XLSX)

c# – Excel将SpreadsheetML转换为Open XML(XLSX)

简单的问题.有没有人知道将SpreadsheetML(Excel 2003 XML)转换为用于Excel 2007(xlsx)文件的Open Document XML的简单方法?

我有一个库,遗憾的是没有读取XML格式,所以我需要尝试找到一种方法来读取数据,这不涉及另一个库.

任何建议赞赏.

解决方法:

从SpreadsheetML到Office Open XML,文件格式确实发生了很大变化.

而且,由于现在电子表格文件被分解为多个XML文件(然后都是压缩的),因此没有一个简单的XLST解决方案的真正希望.

遗憾的是,最直接的做法是使用宏自动化Excel以打开每个SpreadsheetML文件并对新格式执行“另存为”.这可以在Office 2003中使用Office 2007文件格式插件完成.也许这可以降级为批处理,因此服务器不直接参与?

如果电子表格中的数据很简单并且遵循一致的格式,您可以编写自己的解析器直接从SpreadsheetML文件导入.

c# – 使用OpenXML SDK将RTF文件的内容嵌入到DOCX文件中

c# – 使用OpenXML SDK将RTF文件的内容嵌入到DOCX文件中

在我们基于MSWord-97的旧系统中,我们使用COM与.doc文件进行交互,并嵌入一个OLE对象,因此嵌入的文档在父级(而不是图标)中可见.

我们正在使用OpenXML SDK替代这个系统,因为它需要在我们的服务器上安装Word,该文件生成.docx文件.然而,我们仍然需要将RTF文件的内容嵌入生成的DOCX …具体来说,我们用文件的内容替换书签.

我在网上发现了一些例子,但都有所不同.当我在Word中创建一个简单的示例并查看XML时,有很多东西可以定位/显示嵌入对象的可视化表示,而嵌入本身似乎并不太可怕.最简单的方法是什么?

解决方法

您可以将RTF文档的内容嵌入到OpenXML DOCX文件中
通过使用AltChunk锚作为外部内容. AltChunk(w:altChunk)元素指定
您的OpenXML WordprocessingML文档中的位置,以插入RTF文档等外部内容.
下面的代码使用AltChunk类与AlternativeFormatImportPart类
将RTF文档的内容嵌入到最后一段后面的DOCX文件中:
using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(@"your_docx_file.docx",true))
{
  string altChunkId = "AltChunkId5";

  MainDocumentPart mainDocPart = wordDocument.MainDocumentPart;
  AlternativeFormatImportPart chunk = mainDocPart.AddAlternativeFormatImportPart(
        AlternativeFormatImportPartType.Rtf,altChunkId);      

  // Read RTF document content.
  string rtfDocumentContent = File.ReadAllText("your_rtf_document.rtf",Encoding.ASCII);

  using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(rtfDocumentContent)))
  {
    chunk.FeedData(ms);
  }

  AltChunk altChunk = new AltChunk();
  altChunk.Id = altChunkId;

  // Embed AltChunk after the last paragraph.
  mainDocPart.Document.Body.InsertAfter(
    altChunk,mainDocPart.Document.Body.Elements<Paragraph>().Last());

  mainDocPart.Document.Save();
}

如果要将Unicode RTF字符串嵌入到DOCX文件中,则必须转义Unicode字符.例如,请参考以下stackoverflow answer.

当您遇到错误“文件已损坏”,然后确保dispose()或Close()WordprocessingDocument.如果不关闭()文档,则w:altchunk的相关性不会存储在Document.xml.rels文件中.

c# – 使用openxml合并excel中的相邻单元格

c# – 使用openxml合并excel中的相邻单元格

我想使用openxml在excel中合并五个相邻的单元格.我试图通过添加一个单元格来对下面的代码片段进行修改,但它不起作用.它只适用于两个单元格.如果我想合并多个细胞,我该怎么办?

// Given a document name,a worksheet name,and the names of two adjacent cells,merges the two cells.
    // When two cells are merged,only the content from one cell is preserved:
    // the upper-left cell for left-to-right languages or the upper-right cell for right-to-left languages.
    private static void MergeTwoCells(Worksheet worksheet,string cell1Name,string cell2Name)
    {
        // Open the document for editing.
        // Verify if the specified cells exist,and if they do not exist,create them.
        //CreateSpreadsheetCellIfNotExist(worksheet,cell1Name);
        //CreateSpreadsheetCellIfNotExist(worksheet,cell2Name);

            MergeCells mergeCells;
            if (worksheet.Elements<MergeCells>().Count() > 0)
            {
                mergeCells = worksheet.Elements<MergeCells>().First();
            }
            else
            {
                mergeCells = new MergeCells();

                // Insert a MergeCells object into the specified position.
                if (worksheet.Elements<CustomSheetView>().Count() > 0)
                {
                    worksheet.InsertAfter(mergeCells,worksheet.Elements<CustomSheetView>().First());
                }
                else if (worksheet.Elements<DataConsolidate>().Count() > 0)
                {
                    worksheet.InsertAfter(mergeCells,worksheet.Elements<DataConsolidate>().First());
                }
                else if (worksheet.Elements<SortState>().Count() > 0)
                {
                    worksheet.InsertAfter(mergeCells,worksheet.Elements<SortState>().First());
                }
                else if (worksheet.Elements<AutoFilter>().Count() > 0)
                {
                    worksheet.InsertAfter(mergeCells,worksheet.Elements<AutoFilter>().First());
                }
                else if (worksheet.Elements<Scenarios>().Count() > 0)
                {
                    worksheet.InsertAfter(mergeCells,worksheet.Elements<Scenarios>().First());
                }
                else if (worksheet.Elements<ProtectedRanges>().Count() > 0)
                {
                    worksheet.InsertAfter(mergeCells,worksheet.Elements<ProtectedRanges>().First());
                }
                else if (worksheet.Elements<SheetProtection>().Count() > 0)
                {
                    worksheet.InsertAfter(mergeCells,worksheet.Elements<SheetProtection>().First());
                }
                else if (worksheet.Elements<SheetCalculationProperties>().Count() > 0)
                {
                    worksheet.InsertAfter(mergeCells,worksheet.Elements<SheetCalculationProperties>().First());
                }
                else
                {
                    worksheet.InsertAfter(mergeCells,worksheet.Elements<SheetData>().First());
                }
            }

            // Create the merged cell and append it to the MergeCells collection.

            string s1 = cell1Name + ":" + cell2Name ;
            MergeCell mergeCell = new MergeCell() { Reference = s1 };
            mergeCells.Append(mergeCell);

            worksheet.Save();

    }

解决方法

您无需更改代码.如果要合并多个单元格,只需确保cell1Name是要合并的单元格的左上角单元格,而cell2Name是右下角的单元格(即A1:B2将合并单元格A1,A2,B1和B2) .

此外,仅保留左上角单元格中的值(或从右到左文本的右上角).

今天关于c# – 如何使用OpenXML SDK将Excel转换为CSV?openxml格式的讲解已经结束,谢谢您的阅读,如果想了解更多关于.Net Core使用OpenXML导出、导入Excel、c# – Excel将SpreadsheetML转换为Open XML(XLSX)、c# – 使用OpenXML SDK将RTF文件的内容嵌入到DOCX文件中、c# – 使用openxml合并excel中的相邻单元格的相关知识,请在本站搜索。

本文标签: