OpenXML SDK Изменить лист в моем документе Excel - PullRequest
7 голосов
/ 14 февраля 2011

Я создаю пустой шаблон в Excel. Я хотел бы открыть шаблон и отредактировать документ, но я не знаю, как изменить существующий лист. Вот код:

<code>
using (SpreadsheetDocument xl = SpreadsheetDocument.Open(filename, true)) 
{ 
WorkbookPart wbp = xl.WorkbookPart; 
WorkbookPart workbook = xl.WorkbookPart; 
// Get the worksheet with the required name. 
// To be used to match the ID for the required sheet data 
// because the Sheet class and the SheetData class aren't 
// linked to each other directly. 
Sheet s = null; 
if (wbp.Workbook.Sheets.Elements().Count(nm => nm.Name == sheetName) == 0) 
{ 
// no such sheet with that name 
xl.Close(); 
return; 
} 
else 
{ 
s = (Sheet)wbp.Workbook.Sheets.Elements().Where(nm => nm.Name == sheetName).First(); 
} </p>

<p>WorksheetPart wsp = (WorksheetPart)xl.WorkbookPart.GetPartById(s.Id.Value); 
Worksheet worksheet = new Worksheet(); 
SheetData sd = new SheetData(); 
//SheetData sd = (SheetData)wsp.Worksheet.GetFirstChild(); 
Stylesheet styleSheet = workbook.WorkbookStylesPart.Stylesheet; 
//SheetData sheetData = new SheetData(); 
//build the formatted header style 
UInt32Value headerFontIndex = 
util.CreateFont( 
styleSheet, 
"Arial", 
10, 
true, 
System.Drawing.Color.Red); </p>

<p>//build the formatted date style 
UInt32Value dateFontIndex = 
util.CreateFont( 
styleSheet, 
"Arial", 
8, 
true, 
System.Drawing.Color.Black); </p>

<p>//set the background color style 
UInt32Value headerFillIndex = 
util.CreateFill( 
styleSheet, 
System.Drawing.Color.Black); </p>

<p>//create the cell style by combining font/background 
UInt32Value headerStyleIndex = 
util.CreateCellFormat( 
styleSheet, 
headerFontIndex, 
headerFillIndex, 
null); 
/* 
* Create a set of basic cell styles for specific formats... 
* If you are controlling your table then you can simply create the styles you need, 
* this set of code is still intended to be generic. 
*/ 
_numberStyleId = util.CreateCellFormat(styleSheet, null, null, UInt32Value.FromUInt32(3)); 
_doubleStyleId = util.CreateCellFormat(styleSheet, null, null, UInt32Value.FromUInt32(4)); 
_dateStyleId = util.CreateCellFormat(styleSheet, null, null, UInt32Value.FromUInt32(14)); 
_textStyleId = util.CreateCellFormat(styleSheet, headerFontIndex, headerFillIndex, null); 
_percentageStyleId = util.CreateCellFormat(styleSheet, null, null, UInt32Value.FromUInt32(9)); </p>

<p>util.AddNumber(xl, sheetName, (UInt32)3, "E", "27", _numberStyleId); 
util.AddNumber(xl, sheetName, (UInt32)3, "F", "3.6", _doubleStyleId); 
util.AddNumber(xl, sheetName, (UInt32)5, "L", "5", _percentageStyleId); 
util.AddText(xl, sheetName, (UInt32)5, "M", "Dario", _textStyleId); 
util.AddDate(xl, sheetName, (UInt32)3, "J", DateTime.Now, _dateStyleId); 
util.AddImage(xl, sheetName, imagePath, "Smile", "Smile", 30, 30); 
util.MergeCells(xl, sheetName, "D12", "F12"); 
//util.DeleteValueCell(spreadsheet, sheetName, "F", (UInt32)8); </p>

<p>txtCellText.Text = util.GetCellValue(xl, sheetName, (UInt32)5, "M"); </p>

<p>double number = util.GetCellDoubleValue(xl, sheetName, (UInt32)3, "E"); 
double numberD = util.GetCellDoubleValue(xl, sheetName, (UInt32)3, "F"); 
DateTime datee = util.GetCellDateTimeValue(xl, sheetName, (UInt32)3, "J"); </p>

<p>//txtDoubleCell.Text = util.GetCellValue(spreadsheet, sheetName, (UInt32)3, "P"); 
txtPercentualeCell.Text = util.GetCellValue(xl, sheetName, (UInt32)5, "L"); </p>

<p>string date = util.GetCellValue(xl, sheetName, (UInt32)3, "J"); 
double dateD = Convert.ToDouble(date); 
DateTime dateTime = DateTime.FromOADate(dateD); 
txtDateCell.Text = dateTime.ToShortDateString(); </p>

<p>//worksheet.Append(sd); 
/* 
Columns columns = new Columns(); 
columns.Append(util.CreateColumnData(10, 10, 40)); </p>

<p>worksheet.Append(columns); 
*/ 
SheetProtection sheetProtection1 = new SheetProtection() { Sheet = true, Objects = true, Scenarios = true, SelectLockedCells = true, SelectUnlockedCells = true }; 
worksheet.Append(sheetProtection1); 
wsp.Worksheet = worksheet; 
wsp.Worksheet.Save(); </p>

<p>xl.WorkbookPart.Workbook.Save(); 
xl.Close(); 
спасибо!

Обновление

Я пытаюсь, но это не работает. Я все еще использую этот метод (GetWorksheetPart ()), но я хочу получить существующий лист, отредактировать его и сохранить измененный новый документ.

<code>
using (SpreadsheetDocument xl = SpreadsheetDocument.Open(filename, true))
{
     WorkbookPart wbp = xl.WorkbookPart;</p>

 WorksheetPart worksheetPart = util.GetWorksheetPart(wbp, sheetName);
 SheetProtection sheetProtection1 = new SheetProtection() { Sheet = true, Objects = true, Scenarios = true, SelectLockedCells = true, SelectUnlockedCells = true };

 worksheetPart.Worksheet.Append(sheetProtection1);
 worksheetPart.Worksheet.Save(); 

Я создаю документ, НО поврежден. Зачем?

1 Ответ

6 голосов
/ 14 февраля 2011

Чтобы получить существующий рабочий лист для редактирования, используйте этот код, чтобы получить деталь:

        public static WorksheetPart GetWorksheetPart(WorkbookPart workbookPart, string sheetName)
        {
            string relId = workbookPart.Workbook.Descendants<Sheet>()
                                 .Where(s => sheetName.Equals(s.Name))
                                 .First()
                                 .Id;

            return (WorksheetPart)workbookPart.GetPartById(relId);
        }

Просто убедитесь, что имя листа существует, которое вы ищете, или вы получите некоторые исключения. Затем используйте ссылку на этот worksheetpart, чтобы выполнить любые изменения, которые вы хотите, и в конце просто наберите worksheetPart.Worksheet.Save();

EDIT

Элемент SheetProtection необходимо вставить после элемента SheetData. Попробуйте эту строку при добавлении: worksheetPart.Worksheet.Descendants<SheetData>().First().InsertAfterSelf(sheetProtection1);

...