기본적으로 Excel은 문자열을 전체 (통합 문서 당 1 개) SharedStringTablePart
에 저장합니다. 그래서, 이것은 당신이 목표로 삼을 필요가있는 것입니다. 그러나 OpenXML 형식은 또한 WorksheetParts 내부에 인라인 텍스트를 허용합니다. 따라서 완벽한 솔루션이 필요합니다.
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);
}
}
입니다 다음
(일부 인라인 주석) 샘플 응용 프로그램입니다 can not는 "OpenSettings"에 대한 참조 문제를 가져 오는 "new OpenSettings {AutoSave = true}"를 사용하여 저장할 수 없습니다. 템플릿으로 남겨 놓은 다른 통합 문서로 통합 문서를 저장하는 다른 방법은 없습니다 .... – kart@ kart : 요를 충족 샘플 코드 ur 요구 사항 (템플릿로드 및 새 파일 저장). 또한 OpenXML SDK 2.0의 RTM을 사용해야합니다. http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c6e744e5-36e9-45f5-8d8c-331df206e0d0&displaylang=en – mthierba
@ServiceGuy : 감사합니다. soo 많은 당신의 의지 ... 디버깅하는 동안 DoReplace 함수에서 텍스트 바꾸기를 찾을 수 있지만 대체 된 텍스트가 새로 만든 Excel 파일에 표시되지 않습니다. 나를 위해 나는 "SpreadsheetDocument.Open (템플릿, 사실, 새로운 OpenSettings {자동 저장 = true})"OpenSetting 추가 할 수 없습니다 "SpreadsheetDocument.Open()"메서드는 두 개의 매개 변수를 허용하는 세 번째 매개 변수를 허용하지 않습니다 .. .still 나는 새로 만든 file..its의 실제 데이터를 템플릿 파일과 동일하게 대체 할 수 없습니다. – kart