打开xml excel在占位符中插入实际值

我有一个单元格在Excel工作表中包含占位符“$$ value”,问题是我需要使用Open XMLreplace占位符的实际值,并将其另存为单独的工作簿。

这是我试过的代码…它不是取代实际值,也无法保存工作簿。 我需要解决这个问题。

WorksheetPart worksheetPart = (WorksheetPart)myWorkbook.WorkbookPart.GetPartById(sheet.Id); DocumentFormat.OpenXml.Spreadsheet.Worksheet worksheet = worksheetPart.Worksheet; string _txt1 = "$$value"; if (_txt1.Contains("$$")) { worksheet.InnerText.Replace(_txt1, "test"); } 

默认情况下,Excel将string存储在全局(每个工作簿1个) SharedStringTablePart 。 所以,这是你需要的目标。 但是,OpenXML格式还允许在WorksheetParts内embedded文本。 因此,一个完整的解决scheme也需要看看那里。

以下是一个示例应用程序(带有一些内嵌评论):

 using DocumentFormat.OpenXml.Packaging; using x = DocumentFormat.OpenXml.Spreadsheet; class Program { private static readonly string placeHolder = "$$value"; static void Main() { var templatePath = @"C:\Temp\template.xlsx"; var resultPath = @"C:\Temp\result.xlsx"; string replacementText = "test"; using (Stream xlsxStream = new MemoryStream()) { // Read template from disk using (var fileStream = File.OpenRead(templatePath)) fileStream.CopyTo(xlsxStream); // Do replacements ProcessTemplate(xlsxStream, replacementText); // Reset stream to beginning xlsxStream.Seek(0L, SeekOrigin.Begin); // Write results back to disk using (var resultFile = File.Create(resultPath)) xlsxStream.CopyTo(resultFile); } } private static void ProcessTemplate(Stream template, string replacementText) { using (var workbook = SpreadsheetDocument.Open(template, true, new OpenSettings { AutoSave = true })) { // Replace shared strings SharedStringTablePart sharedStringsPart = workbook.WorkbookPart.SharedStringTablePart; IEnumerable<x.Text> sharedStringTextElements = sharedStringsPart.SharedStringTable.Descendants<x.Text>(); DoReplace(sharedStringTextElements, replacementText); // Replace inline strings IEnumerable<WorksheetPart> worksheetParts = workbook.GetPartsOfType<WorksheetPart>(); foreach (var worksheet in worksheetParts) { var allTextElements = worksheet.Worksheet.Descendants<x.Text>(); DoReplace(allTextElements, replacementText); } } // AutoSave enabled } private static void DoReplace(IEnumerable<x.Text> textElements, string replacementText) { foreach (var text in textElements) { if (text.Text.Contains(placeHolder)) text.Text = text.Text.Replace(placeHolder, replacementText); } } 

解答

  private static void ProcessTemplate(Stream template, Dictionary<string,string> toReplace) { using (var workbook = SpreadsheetDocument.Open(template, true, new OpenSettings { AutoSave = true })) { workbook.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = true; workbook.WorkbookPart.Workbook.CalculationProperties.FullCalculationOnLoad = true; //Replace SheetNames foreach (Sheet sheet in workbook.WorkbookPart.Workbook.Sheets) foreach (var key in toReplace.Keys) sheet.Name.Value = sheet.Name.Value.Replace(key, toReplace[key]); foreach (WorksheetPart wsheetpart in workbook.WorkbookPart.WorksheetParts) foreach (SheetData sheetd in wsheetpart.Worksheet.Descendants<x.SheetData>()) foreach (Row r in wsheetpart.Worksheet.Descendants<x.Row>()) foreach (Cell c in r.Descendants<x.Cell>()) if (c.CellFormula != null) { foreach (var key in toReplace.Keys) c.CellFormula.Text = c.CellFormula.Text.Replace(key, toReplace[key]); } // Replace shared strings SharedStringTablePart sharedStringsPart = workbook.WorkbookPart.SharedStringTablePart; IEnumerable<x.Text> sharedStringTextElements = sharedStringsPart.SharedStringTable.Descendants<x.Text>(); for(int i =0;i<toReplace.Keys.Count; i++) DoReplace(sharedStringTextElements, toReplace); IEnumerable<x.Formula> sharedStringTextElementsF = sharedStringsPart.SharedStringTable.Descendants<x.Formula>(); for (int i = 0; i < toReplace.Keys.Count; i++) DoReplaceFormula(sharedStringTextElementsF, toReplace); // Replace inline strings IEnumerable<WorksheetPart> worksheetParts = workbook.GetPartsOfType<WorksheetPart>(); foreach (var worksheet in worksheetParts) { var allTextElements = worksheet.Worksheet.Descendants<x.Text>(); DoReplace(allTextElements, toReplace); var allTextElements2 = worksheet.Worksheet.Descendants<x.Formula>(); DoReplaceFormula(allTextElements2, toReplace); } } // AutoSave enabled } 

我find解决scheme。 你需要使用的是:

SPUtility.GetPrincipalInGroup(spweb,claimGroup.LoginName,100,out maxReached)

这将返回来自这个组的所有用户。