XML SDK 2.0 열기 - 스프레드시트의 셀을 업데이트하는 방법은 무엇입니까?
차트에서 사용하는 스프레드시트의 셀을 Open XML SDK 2.0(CTP)을 사용하여 업데이트하려고 합니다.내가 찾은 모든 코드 샘플은 새 셀을 삽입합니다.올바른 워크시트를 검색하는 데 어려움을 겪고 있습니다.
public static void InsertText(string docName, string text, uint rowIndex,
string columnName)
{
// Open the document for editing.
using (SpreadsheetDocument spreadSheet =
SpreadsheetDocument.Open(docName, true))
{
Workbook workBook = spreadSheet.WorkbookPart.Workbook;
WorksheetPart worksheetPart = workBook.WorkbookPart.
WorksheetParts.First();
SheetData sheetData = worksheetPart.Worksheet.
GetFirstChild<SheetData>();
// If the worksheet does not contain a row with the specified
// row index, insert one.
Row row;
if (sheetData.Elements<Row>().Where(
r => r.RowIndex == rowIndex).Count() != 0)
// At this point I am expecting a match for a row that exists
// in sheet1 but I am not getting one
Visual Studio에서 트리를 탐색하면 세 장의 시트가 표시됩니다. 하지만 그 중에는 자식이 없습니다.제가 무엇을 빠뜨리고 있나요?
여기 작업 코드가 있습니다.이것은 원형입니다.변경 횟수가 많은 경우 문서를 한 번만 열 수 있습니다.또한 시트 이름 및 셀 유형과 같은 하드 코드화된 항목이 있으며, 이를 프로덕션 준비라고 부르기 전에 매개 변수화해야 합니다.http://openxmldeveloper.org/forums/4005/ShowThread.aspx 은 매우 도움이 되었습니다.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Xml;
using System.IO;
using System.Diagnostics;
namespace OpenXMLWindowsApp
{
public class OpenXMLWindowsApp
{
public void UpdateSheet()
{
UpdateCell("Chart.xlsx", "20", 2, "B");
UpdateCell("Chart.xlsx", "80", 3, "B");
UpdateCell("Chart.xlsx", "80", 2, "C");
UpdateCell("Chart.xlsx", "20", 3, "C");
ProcessStartInfo startInfo = new ProcessStartInfo("Chart.xlsx");
startInfo.WindowStyle = ProcessWindowStyle.Normal;
Process.Start(startInfo);
}
public static void UpdateCell(string docName, string text,
uint rowIndex, string columnName)
{
// Open the document for editing.
using (SpreadsheetDocument spreadSheet =
SpreadsheetDocument.Open(docName, true))
{
WorksheetPart worksheetPart =
GetWorksheetPartByName(spreadSheet, "Sheet1");
if (worksheetPart != null)
{
Cell cell = GetCell(worksheetPart.Worksheet,
columnName, rowIndex);
cell.CellValue = new CellValue(text);
cell.DataType =
new EnumValue<CellValues>(CellValues.Number);
// Save the worksheet.
worksheetPart.Worksheet.Save();
}
}
}
private static WorksheetPart
GetWorksheetPartByName(SpreadsheetDocument document,
string sheetName)
{
IEnumerable<Sheet> sheets =
document.WorkbookPart.Workbook.GetFirstChild<Sheets>().
Elements<Sheet>().Where(s => s.Name == sheetName);
if (sheets.Count() == 0)
{
// The specified worksheet does not exist.
return null;
}
string relationshipId = sheets.First().Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)
document.WorkbookPart.GetPartById(relationshipId);
return worksheetPart;
}
// Given a worksheet, a column name, and a row index,
// gets the cell at the specified column and
private static Cell GetCell(Worksheet worksheet,
string columnName, uint rowIndex)
{
Row row = GetRow(worksheet, rowIndex);
if (row == null)
return null;
return row.Elements<Cell>().Where(c => string.Compare
(c.CellReference.Value, columnName +
rowIndex, true) == 0).First();
}
// Given a worksheet and a row index, return the row.
private static Row GetRow(Worksheet worksheet, uint rowIndex)
{
return worksheet.GetFirstChild<SheetData>().
Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
}
}
}
저는 엑셀과 함께 일했고 이 도우미 라이브러리가 큰 도움이 된다는 것을 알게 되었습니다(저는 제 자신의 도우미를 말 그대로 만들었습니다, 만약 제가 이것을 알았다면 적어도 2주는 절약했을 것입니다): https://www.nuget.org/packages/SimpleOOXML/
이것은 셀(라이터)을 업데이트하기 위해 필요한 것입니다.텍스트 붙여넣기(...):
MemoryStream stream = SpreadsheetReader.Create();
SpreadsheetDocument doc = SpreadsheetDocument.Open(stream, true);
WorksheetPart worksheetPart = SpreadsheetReader.GetWorksheetPartByName(doc, "Sheet1");
WorksheetWriter writer = new WorksheetWriter(doc, worksheetPart);
writer.PasteText("B2", "Hello World");
//Save to the memory stream
SpreadsheetWriter.Save(doc);
byte[] result = stream.ToArray();
FileStream file = new FileStream(@"D:\x1.xlsx", FileMode.Create);
file.Write(result, 0, result.Length);
file.Close();
@CDonner가 게시한 코드는 몇 가지 예외를 발생시킵니다. 코드를 처리할 코드 중 일부를 추가했습니다. 이 코드는 예외를 발생시킵니다. 여기에 있습니다.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Xml;
using System.IO;
using System.Diagnostics;
namespace Application.Model{
public class TempCode
{
public TempCode()
{
UpdateCell("E:/Visual Studio Code/Book1.xlsx", "120", 1, "A");
UpdateCell("E:/Visual Studio Code/Book1.xlsx", "220", 2, "B");
UpdateCell("E:/Visual Studio Code/Book1.xlsx", "320", 3, "C");
UpdateCell("E:/Visual Studio Code/Book1.xlsx", "420", 4, "D");
UpdateCell("E:/Visual Studio Code/Book1.xlsx", "520", 5, "E");
ProcessStartInfo startInfo = new ProcessStartInfo("E:/Visual Studio Code/Book1.xlsx");
startInfo.WindowStyle = ProcessWindowStyle.Normal;
Process.Start(startInfo);
}
public static void UpdateCell(string docName, string text,uint rowIndex, string columnName){
// Open the document for editing.
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
{
WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, "Sheet2");
if (worksheetPart != null)
{
Cell cell = GetCell(worksheetPart.Worksheet, columnName, rowIndex);
cell.CellValue = new CellValue(text);
cell.DataType = new EnumValue<CellValues>(CellValues.Number);
// Save the worksheet.
worksheetPart.Worksheet.Save();
}
}
}
private static WorksheetPart GetWorksheetPartByName(SpreadsheetDocument document, string sheetName){
IEnumerable<Sheet> sheets =document.WorkbookPart.Workbook.GetFirstChild<Sheets>().
Elements<Sheet>().Where(s => s.Name == sheetName);
if (sheets.Count() == 0){
return null;
}
string relationshipId = sheets.First().Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(relationshipId);
return worksheetPart;
}
private static Cell GetCell(Worksheet worksheet, string columnName, uint rowIndex)
{
Row row;
string cellReference = columnName + rowIndex;
if (worksheet.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0)
row = worksheet.GetFirstChild<SheetData>().Elements<Row>().Where(r => r.RowIndex == rowIndex).FirstOrDefault();
else{
row = new Row() { RowIndex = rowIndex };
worksheet.Append(row);
}
if (row == null)
return null;
if (row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).Count() > 0) {
return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First();
}
else{
Cell refCell = null;
foreach (Cell cell in row.Elements<Cell>()){
if (string.Compare(cell.CellReference.Value, cellReference, true) > 0){
refCell = cell;
break;
}
}
Cell newCell = new Cell() {
CellReference = cellReference,
StyleIndex = (UInt32Value)1U
};
row.InsertBefore(newCell, refCell);
worksheet.Save();
return newCell;
}
}
}
}
그러나 SDK 2.5는 매우 유용한 코드였습니다. http://fczaja.blogspot.dk/2013/05/how-to-read-and-write-excel-cells-with.html
텍스트 값을 추가하기 위해 텍스트 값을 약간 수정해야 합니다.SharedStringTablePart.
// Given text and a SharedStringTablePart, creates a SharedStringItem with the specified text
// and inserts it into the SharedStringTablePart. If the item already exists, returns its index.
private static int InsertSharedStringItem(string text, SharedStringTablePart shareStringPart)
{
// If the part does not contain a SharedStringTable, create one.
if (shareStringPart.SharedStringTable == null)
{
shareStringPart.SharedStringTable = new SharedStringTable();
}
int i = 0;
// Iterate through all the items in the SharedStringTable. If the text already exists, return its index.
foreach (SharedStringItem item in shareStringPart.SharedStringTable.Elements<SharedStringItem>())
{
if (item.InnerText == text)
{
return i;
}
i++;
}
// The text does not exist in the part. Create the SharedStringItem and return its index.
shareStringPart.SharedStringTable.AppendChild(new SharedStringItem(new Text(text)));
shareStringPart.SharedStringTable.Save();
return i;
}
다음과 같이 사용합니다.
SharedStringTablePart shareStringPart = GetSharedStringTablePart(excelDoc);
// Insert the text into the SharedStringTablePart.
int index = InsertSharedStringItem(cellValue, shareStringPart);
// Set the value of cell A1.
cell.CellValue = new CellValue(index.ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
@AZ 코드를 변경했습니다.
먼저 GetCell 기능에서 현재 행을 선택하는 데 문제가 있습니다.변경하기만 하면 됩니다.
if (worksheet.GetFirstChild<SheetData>().Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0)
다음 대신:
if (worksheet.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0)
다음 섹션에서 다음과 같습니다.
if (string.Compare(cell.CellReference.Value, cellReference, true) > 0)
Z 열 위의 열을 사용하는 경우(예: AA 열) 제대로 작동하지 않습니다.이를 위해 열 번호를 사용하여 셀을 삽입할 위치를 결정합니다.
이를 위해 열 문자를 숫자로 변환하는 열 인덱스 함수를 만들었습니다.
private static int ColumnIndex(string reference)
{
int ci = 0;
reference = reference.ToUpper();
for (int ix = 0; ix < reference.Length && reference[ix] >= 'A'; ix++)
ci = (ci * 26) + ((int)reference[ix] - 64);
return ci;
}
그래서 문자열 비교 기능을 변경했습니다.
string columnNew = new String(cellReference.Where(c => c != '-' && (c < '0' || c > '9')).ToArray());
foreach (Cell cell in row.Elements<Cell>())
{
string columnBase = new String(cell.CellReference.Value.Where(c => c != '-' && (c < '0' || c > '9')).ToArray());
if (ColumnIndex(columnBase) > ColumnIndex(columnNew))
{
refCell = cell;
break;
}
}
안부 전합니다.
var sheetData = new SheetData();
var row = UpdateCell("A","Hello World", 5);
sheetData.Append(row);
worksheet.Append(sheetData);
private static Row UpdateCell(string columnName, string value, int rowIndex)
{
Row row = new Row { RowIndex = (uint)rowIndex };
Cell c1 = new TextCell(columnName, value, rowIndex);
row.Append(c1);
return row;
}
public class TextCell : Cell
{
public TextCell(string header, string text, int index)
{
this.DataType = CellValues.InlineString;
this.CellReference = header + index;
//Add text to the text cell.
this.InlineString = new InlineString { Text = new Text { Text = text } };
}
}
언급URL : https://stackoverflow.com/questions/527028/open-xml-sdk-2-0-how-to-update-a-cell-in-a-spreadsheet
'source' 카테고리의 다른 글
| EDMX 모델에서 특정 테이블을 신속하게 찾는 방법은 무엇입니까? (0) | 2023.05.28 |
|---|---|
| 사용 안 함 경고: 스크립트를 다른 서버로 이동할 때 보안 및 사용 편의성 문제로 인해 버퍼()가 사용되지 않습니다. (0) | 2023.05.28 |
| Xcode 프로세스 시작 실패:보안. (0) | 2023.05.28 |
| 가장 유용한 속성 (0) | 2023.05.28 |
| 목록의 특정 인덱스에 요소를 삽입하고 업데이트된 목록을 반환합니다. (0) | 2023.05.28 |