关于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格式)
- .Net Core使用OpenXML导出、导入Excel
- c# – Excel将SpreadsheetML转换为Open XML(XLSX)
- c# – 使用OpenXML SDK将RTF文件的内容嵌入到DOCX文件中
- c# – 使用openxml合并excel中的相邻单元格
c# – 如何使用OpenXML SDK将Excel转换为CSV?(openxml格式)
我发现没有互操作的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
导出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)
简单的问题.有没有人知道将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文件中
我们正在使用OpenXML SDK替代这个系统,因为它需要在我们的服务器上安装Word,该文件生成.docx文件.然而,我们仍然需要将RTF文件的内容嵌入生成的DOCX …具体来说,我们用文件的内容替换书签.
我在网上发现了一些例子,但都有所不同.当我在Word中创建一个简单的示例并查看XML时,有很多东西可以定位/显示嵌入对象的可视化表示,而嵌入本身似乎并不太可怕.最简单的方法是什么?
解决方法
通过使用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中的相邻单元格
// 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(); }
解决方法
此外,仅保留左上角单元格中的值(或从右到左文本的右上角).
今天关于c# – 如何使用OpenXML SDK将Excel转换为CSV?和openxml格式的讲解已经结束,谢谢您的阅读,如果想了解更多关于.Net Core使用OpenXML导出、导入Excel、c# – Excel将SpreadsheetML转换为Open XML(XLSX)、c# – 使用OpenXML SDK将RTF文件的内容嵌入到DOCX文件中、c# – 使用openxml合并excel中的相邻单元格的相关知识,请在本站搜索。
本文标签: