即将生气这个问题.我确信这很简单,我只是错过了它,但我不能为我的生活找到如何使用C#中的OpenXml SDK v2.0更改Word 2007中的内容控件的内容.
我创建了一个带有纯文本内容控件的Word文档.此控件的标记是"FirstName".在代码中,我想打开Word文档,找到此内容控件,并更改内容而不会丢失格式.
我最终开始工作的解决方案包括找到内容控件,在其后面插入一个run,然后删除内容控件:
using (WordprocessingDocument wordProcessingDocument = WordprocessingDocument.Open(filePath, true)) {
MainDocumentPart mainDocumentPart = wordProcessingDocument.MainDocumentPart;
SdtRun sdtRun = mainDocumentPart.Document.Descendants<SdtRun>()
.Where(run => run.SdtProperties.GetFirstChild<Tag>().Val == "FirstName").Single();
if (sdtRun != null) {
sdtRun.Parent.InsertAfter(new Run(new Text("John")), sdtRun);
sdtRun.Remove();
}
Run Code Online (Sandbox Code Playgroud)
这确实改变了文本,但我丢失了所有格式.有谁知道我怎么做到这一点?
这两个Office Open XML片段之间有什么区别?
<c r="A2" t="str">
<v>btyler</v>
</c>
Run Code Online (Sandbox Code Playgroud)
和
<c r="B2">
<is><t>btyler</t></is>
</c>
Run Code Online (Sandbox Code Playgroud)
注意:我根据规范手动创建的第二个示例,第一个是来自实际的Excel工作簿.
双方似乎都有效,并根据规范几乎是相同的,所以我不知道为什么会有t="str"时<is>似乎做同样的事情.Excel何时选择使用其中一个?
OpenXml文档中的CreateSpreadsheetWorkbook示例方法确实直接转换为F#.问题似乎是Sheets对象的Append方法.代码执行时没有错误,但生成的xlsx文件缺少应该附加的内部Xml,并且Excel无法读取该文件.我怀疑问题源于将功能性F#结构转换为System.Collections类型,但我没有直接证据.
我在C#和VB.NET(即文档示例)中运行了类似的代码,它完美地执行并创建一个可读的,完整的xlsx文件.
我知道我可以直接处理XML,但我想了解F#和OpenXml之间不匹配的性质.有什么建议?
代码几乎直接来自示例:
namespace OpenXmlLib
open System
open DocumentFormat
open DocumentFormat.OpenXml
open DocumentFormat.OpenXml.Packaging
open DocumentFormat.OpenXml.Spreadsheet
module OpenXmlXL =
// this function overwrites an existing file without warning!
let CreateSpreadsheetWorkbook (filepath: string) =
// Create a spreadsheet document by supplying the filepath.
// By default, AutoSave = true, Editable = true, and Type = xlsx.
let spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook)
// Add a WorkbookPart to the document.
let workbookpart = spreadsheetDocument.AddWorkbookPart()
workbookpart.Workbook <- new Workbook()
// Add a WorksheetPart to …Run Code Online (Sandbox Code Playgroud) 由于文档很少,我在C#中遇到OpenXml SpreadSheetDocument问题.
使用Open XML for Excel DocumentFormat.OpenXml.Spreadsheet,如何仅将文本的一部分设置为粗体?
var cell = new Cell {
//DataType = CellValues.InlineString,
CellReference = "A" + 1
};
// TODO: Set "bold text" to bold style
//var inlineString = new InlineString();
//inlineString.AppendChild(new Text { Text = "Normal text... bold text..." });
//cell.AppendChild(inlineString);
Run Code Online (Sandbox Code Playgroud)
注释掉现在使用的代码,但应该或可能应该更改.
我试图用OpenXML在Excel中创建命名范围.我能够在DefinedNames集合中添加DefinedName,但似乎没有做任何事情.我注意到在ExtendedFileProperties中有一个位置,其中保存了范围的名称,一个名为"TitlesOfParts"的结构.我尝试在那里添加一个条目,但这会导致excel抛出错误,并且不会创建命名范围.这是我正在使用的代码:
public void AddNamedRange(string pNamedRangeRef, string pNamedRangeName)
{
DefinedName _definedName = new DefinedName() { Name = pNamedRangeName, Text = pNamedRangeRef };
_workbook.Descendants<DocumentFormat.OpenXml.Spreadsheet.DefinedNames>().First().Append(_definedName);
DocumentFormat.OpenXml.VariantTypes.VTLPSTR _t = new DocumentFormat.OpenXml.VariantTypes.VTLPSTR() { Text = pNamedRangeName };
_spreadsheet.ExtendedFilePropertiesPart.Properties.TitlesOfParts.VTVector.Append(_t);
_spreadsheet.ExtendedFilePropertiesPart.Properties.TitlesOfParts.VTVector.Size++;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OpenXML框架在Excel电子表格中设置默认列宽,因此我的文件已损坏.这是代码
private void initSpreadsheetDocument()
{
// Add a WorkbookPart to the spreadsheet document.
WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
workbookpart.Workbook = new Workbook();
var sheetData = new SheetData();
var properties = new SheetFormatProperties { DefaultColumnWidth = 25D };
Worksheet worksheet = new Worksheet();
worksheet.AppendChild(sheetData);
// here is line of code that corrupt file
// without it - file is being generated properly
worksheet.AppendChild(properties); ![enter image description here][1]
// Add a WorksheetPart to the WorkbookPart.
WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = worksheet;
// …Run Code Online (Sandbox Code Playgroud) 早上好,我想从已经存在的excell文件中编辑一些单元格.我尝试过使用EPPlus和普通的OpenXml类.但是我失败了.在这两种情况下,程序都不会崩溃但总是返回旧的(未修改的)excel.拜托,我做错了什么?
试验1 - EPPlus:
MemoryStream memoryStream = new MemoryStream();
using (var fs = new FileStream(@"Path\Test.xlsx", FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
}
using (ExcelPackage excelPackage = new ExcelPackage(memoryStream))
{
ExcelWorkbook excelWorkBook = excelPackage.Workbook;
ExcelWorksheet excelWorksheet = excelWorkBook.Worksheets.First();
excelWorksheet.Cells[1, 1].Value = "Test";
excelWorksheet.Cells[3, 2].Value = "Test2";
excelWorksheet.Cells[3, 3].Value = "Test3";
excelPackage.Save();
}
memoryStream.Position = 0;
return new FileStreamResult(memoryStream, "application/xlsx")
{
FileDownloadName = …Run Code Online (Sandbox Code Playgroud) 我正在接近以Excel OpenXML格式(xlsx)导出大量数据(115.000行x 30列).我正在使用一些像DocumentFormat.OpenXML,ClosedXML,NPOI这样的库.
每次抛出OutOfMemoryException都会抛出,因为内存中表单的表示会导致指数内存增加.
每1000个关闭文档文件(并释放内存),下一次加载会导致内存增加.
是否有更高效的方式在xlsx中导出数据而不占用大量内存?
Word似乎使用与Visual Studio不同的撇号字符,这导致使用Regex出现问题。
我正在尝试使用OpenXML在C#中编辑一些Word文档。我基本上是用公司名称代替[[COMPANY]]。直到我到达名称以s结尾的公司的极端案例为止,这一直非常顺利。我最终遇到问题s,有时它会创建一个s。
示例:公司名称:Simmons Doc中的文本:[[COMPANY]]的业务是汽车。结果:Simmons的业务是汽车。
这是不正确的英语。
我应该能够像使用[[COMPANY]]一样使用基本的查找和替换,但是它不起作用。
Regex apostropheReplace = new Regex("s\\'s");
docText = apostropheReplace.Replace(docText, "s\'");
Run Code Online (Sandbox Code Playgroud)
这不是。似乎Word使用的字符和撇号()不同于我在Visual Studio中使用键盘上的键创建的标准字符。如果我使用键盘写了一个查找并替换,它将无法正常工作,但是如果我复制并粘贴Word中的撇号,它将起作用。
Regex apostrophyReplace = new Regex("s\\’s");
docText = apostrophyReplace.Replace(docText, "s\'");
Run Code Online (Sandbox Code Playgroud)
注意第二个正则表达式中的不同字符。我对为什么这样做感到困惑,并且还想知道这样做是否正确。我尝试使用“'”,但这不起作用。我只想知道是否使用从Word复制的字符是执行此操作的正确方法,并且是否有办法做到这两个字符都能正常工作,所以我对使用其他方法创建的文档没有问题程序。