这里提到了使用DataGridView 去生成三种不同类型的文件,其实生成EXCEL我曾经遇到过三种,希望这些对广大开发者有帮助。并且当中我还列出一些如何通过xls导入到datagridview,很多使用该winform技术的同仁一定很熟悉这种方法。
1.首先是如何将数据从 xls文件加载到winform的DataGridView控件中。
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog fileDLG = new OpenFileDialog();
fileDLG.Title = "Open Excel File";
fileDLG.Filter = "Excel Files|*.xls;*.xlsx";
fileDLG.InitialDirectory = @"C:\Users\...\Desktop\";
if (fileDLG.ShowDialog() == DialogResult.OK)
{
string filename = System.IO.Path.GetFileName(fileDLG.FileName);
string path = System.IO.Path.GetDirectoryName(fileDLG.FileName);
excelLocationTB.Text = @path + "\\" + filename;
string ExcelFile = @excelLocationTB.Text;
if (!File.Exists(ExcelFile))
MessageBox.Show(String.Format("File {0} does not Exist", ExcelFile));
OleDbConnection theConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ExcelFile + ";Extended Properties=Excel 12.0;");
theConnection.Open();
OleDbDataAdapter theDataAdapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", theConnection);
DataSet DS = new DataSet();
theDataAdapter.Fill(DS, "ExcelInfo");
dataGridView1.DataSource = DS.Tables["ExcelInfo"];
formatDataGrid();
MessageBox.Show("Excel File Loaded");
toolStripProgressBar1.Value += 0;
}
}
private void formatDataGrid()
{
dataGridView1.ColumnHeadersVisible = true;
dataGridView1.Columns[0].Name = "Path Name";
dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
}
2.接下来如何将DataGridView控件中的数据保存到CSV格式的文件中。
if (dataGridView1.Rows.Count == 0)
{
MessageBox.Show("No data available!", "Prompt", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "CSV files (*.csv)|*.csv";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.FileName = null;
saveFileDialog.Title = "Save path of the file to be exported";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
Stream myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
string strLine = "";
try
{
//Write in the headers of the columns.
for (int i = 0; i < dataGridView1.ColumnCount; i++)
{
if (i > 0)
strLine += ",";
strLine += dataGridView1.Columns[i].HeaderText;
}
strLine.Remove(strLine.Length - 1);
sw.WriteLine(strLine);
strLine = "";
//Write in the content of the columns.
for (int j = 0; j < dataGridView1.Rows.Count; j++)
{
strLine = "";
for (int k = 0; k < dataGridView1.Columns.Count; k++)
{
if (k > 0)
strLine += ",";
if (dataGridView1.Rows[j].Cells[k].Value == null)
strLine += "";
else
{
string m = dataGridView1.Rows[j].Cells[k].Value.ToString().Trim();
strLine += m.Replace(",", ",");
}
}
strLine.Remove(strLine.Length - 1);
sw.WriteLine(strLine);
//Update the Progess Bar.
toolStripProgressBar1.Value = 100 * (j + 1) / dataGridView1.Rows.Count;
}
sw.Close();
myStream.Close();
MessageBox.Show("Data has been exported to:" + saveFileDialog.FileName.ToString(), "Exporting Completed", MessageBoxButtons.OK, MessageBoxIcon.Information);
toolStripProgressBar1.Value = 0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exporting Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
3.接下是如何保存到XML,这里提供了两种方法。
Output to XML file format using StreamWriting Object.
if (dataGridView1.Rows.Count == 0)
{
MessageBox.Show("No data available!", "Prompt", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "XML files (*.xml)|*.xml";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.FileName = null;
saveFileDialog.Title = "Save path of the file to be exported";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
Stream myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
try
{
sw.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
sw.WriteLine("<NewXML>");
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
sw.WriteLine("<Row" + i + ">");
for (int j = 0; j < dataGridView1.Columns.Count; j++)
sw.WriteLine("<" + dataGridView1.Columns[j].HeaderText + ">" + dataGridView1.Rows[i].Cells[j].Value.ToString().Trim() + "</" + dataGridView1.Columns[j].HeaderText + ">");
sw.WriteLine("</Row" + i + ">");
//Update the Progess Bar.
toolStripProgressBar1.Value = 100 * (i + 1) / (dataGridView1.Rows.Count - 1);
}
sw.WriteLine("</NewXML>");
sw.Close();
myStream.Close();
MessageBox.Show("Data has been exported to:" + saveFileDialog.FileName.ToString(), "Exporting Completed", MessageBoxButtons.OK, MessageBoxIcon.Information);
toolStripProgressBar1.Value = 0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exporting Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
上面是hard code写法,用XMLELEMENT也能达到同样目的。
if (dataGridView1.Rows.Count == 0)
{
MessageBox.Show("No data available!", "Prompt", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "XML files (*.xml)|*.xml";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.FileName = null;
saveFileDialog.Title = "Save path of the file to be exported";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
string str = saveFileDialog.FileName;
XmlDocument doc = new XmlDocument();
XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
doc.AppendChild(docNode);
// Create and insert a new element.
XmlNode rowsNode = doc.CreateElement("NewXML");
doc.AppendChild(rowsNode);
try
{
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
XmlNode rowNode = doc.CreateElement("row" + i);
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
XmlAttribute rowAttribute = doc.CreateAttribute(dataGridView1.Columns[j].HeaderText);
rowAttribute.Value =dataGridView1.Rows[i].Cells[j].Value.ToString().Trim() ;
rowNode.Attributes.Append(rowAttribute);
rowsNode.AppendChild(rowNode);
}
//Update the Progess Bar.
toolStripProgressBar1.Value = 100 * (i + 1) / (dataGridView1.Rows.Count - 1);
}
doc.Save(str);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exporting Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
3.最后提供保存到EXCEL的三种方法,第一种是hardcode,第二种是openxml pacage,第三种是传统的操作Excl interp的貌似是 Automatic方法。
if (dataGridView1.Rows.Count == 0)
{
MessageBox.Show("No data available!", "Prompt", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
else
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.FileName = null;
saveFileDialog.Title = "Save path of the file to be exported";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
Stream myStream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
string strLine = "";
try
{
//Write in the headers of the columns.
for (int i = 0; i < dataGridView1.ColumnCount; i++)
{
if (i > 0)
strLine += Convert.ToChar(9);
strLine += dataGridView1.Columns[i].HeaderText;
}
strLine.Remove(strLine.Length - 1);
sw.WriteLine(strLine);
strLine = "";
//Write in the content of the columns.
for (int j = 0; j < dataGridView1.Rows.Count; j++)
{
strLine = "";
for (int k = 0; k < dataGridView1.Columns.Count; k++)
{
if (k > 0)
strLine += Convert.ToChar(9);
if (dataGridView1.Rows[j].Cells[k].Value == null)
strLine += "";
else
{
string m = dataGridView1.Rows[j].Cells[k].Value.ToString().Trim();
strLine += m.Replace(",", ",");
}
}
strLine.Remove(strLine.Length - 1);
sw.WriteLine(strLine);
//Update the Progess Bar.
toolStripProgressBar1.Value = 100 * (j + 1) / dataGridView1.Rows.Count;
}
sw.Close();
myStream.Close();
MessageBox.Show("Data has been exported to:" + saveFileDialog.FileName.ToString(), "Exporting Completed", MessageBoxButtons.OK, MessageBoxIcon.Information);
toolStripProgressBar1.Value = 0;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exporting Error", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
Automatic:
int iRows = 0;
int iCols = 0;
int iTrueCols = 0;
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Add(System.Reflection.Missing.Value);
Microsoft.Office.Interop.Excel.Worksheet ws = null;
if (wb.Worksheets.Count > 0)
{
ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);
}
else
{
wb.Worksheets.Add(System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.Worksheets.get_Item(1);
}
if (ws != null)
{
ws.Name = "SheetName";
iRows = dataGridView1.Rows.Count; //加上列头行
iTrueCols = dataGridView1.Columns.Count; //包含隐藏的列,一共有多少列
//求列数,省略Visible = false的列
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
if (dataGridView1.Columns[i].Visible) iCols++;
}
string[,] dimArray = new string[iRows + 1, iCols];
for (int j = 0, k = 0; j < iTrueCols; j++)
{
//省略Visible = false的列
if (dataGridView1.Columns[j].Visible)
{
dimArray[0, k] = dataGridView1.Columns[j].HeaderText;
k++;
}
}
for (int i = 0; i < iRows; i++)
{
for (int j = 0, k = 0; j < iTrueCols; j++)
{
//省略Visible = false的列
if (dataGridView1.Columns[j].Visible)
{
if (dataGridView1.Rows[i].Cells[j].Value != null)
dimArray[i + 1, k] = dataGridView1.Rows[i].Cells[j].Value.ToString();
else
dimArray[i + 1, k] = "";
k++;
}
}
}
ws.get_Range(ws.Cells[1, 1] as Microsoft.Office.Interop.Excel.Range, ws.Cells[iRows + 1, iCols] as Microsoft.Office.Interop.Excel.Range).Value2 = dimArray;
ws.get_Range(ws.Cells[1, 1] as Microsoft.Office.Interop.Excel.Range, ws.Cells[1, iCols] as Microsoft.Office.Interop.Excel.Range).Font.Bold = true;
ws.get_Range(ws.Cells[1, 1] as Microsoft.Office.Interop.Excel.Range, ws.Cells[iRows + 1, iCols] as Microsoft.Office.Interop.Excel.Range).Font.Size = 10.0;
ws.get_Range(ws.Cells[1, 1] as Microsoft.Office.Interop.Excel.Range, ws.Cells[iRows + 1, iCols] as Microsoft.Office.Interop.Excel.Range).RowHeight = 14.25;
//ws.Columns[.ColumnWidth = datagridview.Columns[0].Width;
for (int j = 0, k = 0; j < iTrueCols; j++)
{
//省略Visible = false的列
if (dataGridView1.Columns[j].Visible)
{
ws.get_Range(ws.Cells[1, k + 1] as Microsoft.Office.Interop.Excel.Range, ws.Cells[1, k + 1] as Microsoft.Office.Interop.Excel.Range).ColumnWidth = (dataGridView1.Columns[j].Width / 8.4) > 255 ? 255 : (dataGridView1.Columns[j].Width / 8.4);
//ws.Columns.c = datagridview.Columns[j].Width;
k++;
}
}
}
app.Visible = true;
OpenXml:
string myStream = saveFileDialog.FileName;
CreateSpreadsheetWorkbook(myStream,dvtodt(dataGridView1));
string myStream = saveFileDialog.FileName;
CreateSpreadsheetWorkbook(myStream,dvtodt(dataGridView1));
先将DataGridView转换为DataTable,在操作:
public static void CreateSpreadsheetWorkbook(string filepath, DataTable dt)
{
// Create a spreadsheet document by supplying the filepath.
// By default, AutoSave = true, Editable = true, and Type = xlsx.
FileInfo fileInfo = new FileInfo(filepath);
if (fileInfo.Exists)
fileInfo.Delete();
SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);
// Add a WorkbookPart to the document.
WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart();
workbookPart.Workbook = new Workbook();
// Add a WorksheetPart to the WorkbookPart.
WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());
// Add a workStylesPart to the workbookPart.
WorkbookStylesPart workStylesPart = workbookPart.AddNewPart<WorkbookStylesPart>();
workStylesPart.Stylesheet = new Stylesheet();
// Add a Stylesheet to the workStylesPart.
WorkbookStylesPart workbookStylesPart = spreadsheetDocument.WorkbookPart.WorkbookStylesPart;
Stylesheet styleSheet = workbookStylesPart.Stylesheet;
// Add Fonts and other some information.
Fonts fonts = new Fonts() { Count = (UInt32Value)2U, KnownFonts = true };
// Add based font to Fonts.
Font font = new Font();
FontSize fontSize = new FontSize() { Val = 11D };
Color color = new Color() { Theme = (UInt32Value)1U };
FontName fontName = new FontName() { Val = "Calibri" };
FontFamilyNumbering fontFamilyNumbering = new FontFamilyNumbering() { Val = 2 };
FontScheme fontScheme = new FontScheme() { Val = FontSchemeValues.Minor };
font.Append(fontSize);
font.Append(color);
font.Append(fontName);
font.Append(fontFamilyNumbering);
font.Append(fontScheme);
// Add fontSpecial to Fonts.
Font fontSpecial = new Font();
Bold bold = new Bold();
FontSize fontSizeSpecial = new FontSize() { Val = 11D };
Color colorSpecial = new Color() { Theme = (UInt32Value)1U };
FontName fontNameSpecial = new FontName() { Val = "Calibri" };
FontFamilyNumbering fontFamilyNumberingSpecial = new FontFamilyNumbering() { Val = 2 };
FontScheme fontSchemeSpecial = new FontScheme() { Val = FontSchemeValues.Minor };
fontSpecial.Append(bold);
fontSpecial.Append(fontSizeSpecial);
fontSpecial.Append(colorSpecial);
fontSpecial.Append(fontNameSpecial);
fontSpecial.Append(fontFamilyNumberingSpecial);
fontSpecial.Append(fontSchemeSpecial);
// Add font and fontSpecial to fonts collection.
fonts.Append(font);
fonts.Append(fontSpecial);
// Fills.When the object is serialized out as xml, its qualified name is x:fills.
Fills fills = new Fills() { Count = (UInt32Value)2U };
Fill fill = new Fill();
// Pattern.When the object is serialized out as xml, its qualified name is x:patternFill.
PatternFill patternFill = new PatternFill() { PatternType = PatternValues.None };
fill.Append(patternFill);
// This patternFillSpecial served for fillSpecial.
Fill fillSpecial = new Fill();
PatternFill patternFillSpecial = new PatternFill() { PatternType = PatternValues.Gray125 };
fillSpecial.Append(patternFillSpecial);
// Add fill and fillSpecial to fills collection.
fills.Append(fill);
fills.Append(fillSpecial);
// Borders.When the object is serialized out as xml, its qualified name is x:borders.
Borders borders = new Borders() { Count = (UInt32Value)1U };
Border border = new Border();
// Left Border.When the object is serialized out as xml, its qualified name is x:left.
LeftBorder leftBorder = new LeftBorder();
// Right Border.When the object is serialized out as xml, its qualified name is x:right.
RightBorder rightBorder = new RightBorder();
//Top Border.When the object is serialized out as xml, its qualified name is x:top.
TopBorder topBorder = new TopBorder();
// Bottom Border.When the object is serialized out as xml, its qualified name is x:bottom.
BottomBorder bottomBorder = new BottomBorder();
// This element specifies the color and line style for the diagonal border(s) of a cell,
// possibly including diagonally up and diagonally down.
DiagonalBorder diagonalBorder = new DiagonalBorder();
// Add leftBorder, rightBorder,topBorder,bottomBorder and diagonalBorder into border.
border.Append(leftBorder);
border.Append(rightBorder);
border.Append(topBorder);
border.Append(bottomBorder);
border.Append(diagonalBorder);
borders.Append(border);
// This is the critical object when the sample want to bold the cell format.
CellStyleFormats cellStyleFormats = new CellStyleFormats() { Count = (UInt32Value)1U };
CellFormat cellFormat = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U };
// Add cellFormat to cellStyleFormats
cellStyleFormats.Append(cellFormat);
CellFormats cellFormats = new CellFormats() { Count = (UInt32Value)2U };
CellFormat cellFormatSpecial = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U };
CellFormat cellFormatAnotherSpecial = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)1U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U, ApplyFont = true };
cellFormats.Append(cellFormatSpecial);
cellFormats.Append(cellFormatAnotherSpecial);
CellStyles cellStyles = new CellStyles() { Count = (UInt32Value)1U };
CellStyle cellStyle = new CellStyle() { Name = "Normal", FormatId = (UInt32Value)0U, BuiltinId = (UInt32Value)0U };
cellStyles.Append(cellStyle);
DifferentialFormats differentialFormats = new DifferentialFormats() { Count = (UInt32Value)0U };
TableStyles tableStyles = new TableStyles() { Count = (UInt32Value)0U, DefaultTableStyle = "TableStyleMedium2", DefaultPivotStyle = "PivotStyleLight16" };
StylesheetExtensionList stylesheetExtensionList = new StylesheetExtensionList();
StylesheetExtension stylesheetExtension = new StylesheetExtension() { Uri = "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}" };
stylesheetExtension.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
stylesheetExtensionList.Append(stylesheetExtension);
// Add fonts,fills,borders,cellStyleFormats,cellFormats,cellStyles,differentialFormats,tableStyles and stylesheetEntensionList to styleSheet
styleSheet.Append(fonts);
styleSheet.Append(fills);
styleSheet.Append(borders);
styleSheet.Append(cellStyleFormats);
styleSheet.Append(cellFormats);
styleSheet.Append(cellStyles);
styleSheet.Append(differentialFormats);
styleSheet.Append(tableStyles);
styleSheet.Append(stylesheetExtensionList);
// Save the result.
styleSheet.Save();
// Add Sheets to the Workbook.
Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
// Append a new worksheet and associate it with the workbook.
Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "mySheet" };
sheets.Append(sheet);
string cl = "";
uint row = 2;
int index;
Cell cell;
// fill data into Excel file
foreach (DataRow dr in dt.Rows)
{
for (int idx = 0; idx < dt.Columns.Count; idx++)
{
if (idx >= 26)
cl = "A" + Convert.ToString(Convert.ToChar(65 + idx - 26));
else
cl = Convert.ToString(Convert.ToChar(65 + idx));
SharedStringTablePart shareStringPart;
if (spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().Count() > 0)
{
shareStringPart = spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
}
else
{
shareStringPart = spreadsheetDocument.WorkbookPart.AddNewPart<SharedStringTablePart>();
}
if (row == 2)
{
index = InsertSharedStringItem(dt.Columns[idx].ColumnName, shareStringPart);
cell = InsertCellInWorksheet(cl, row - 1, worksheetPart);
cell.CellValue = new CellValue(index.ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
}
// Insert the text into the SharedStringTablePart.
index = InsertSharedStringItem(dr[idx].ToString(), shareStringPart);
cell = InsertCellInWorksheet(cl, row, worksheetPart);
cell.CellValue = new CellValue(index.ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
}
row++;
}
// Save the workbookPart.
workbookPart.Workbook.Save();
// Close the document.
spreadsheetDocument.Close();
}
/// <summary>
/// Insert SharedStringItem object.
/// </summary>
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 DocumentFormat.OpenXml.Spreadsheet.Text(text)));
shareStringPart.SharedStringTable.Save();
return i;
}
/// <summary>
/// Insert cell in worksheet.
/// </summary>
private static Cell InsertCellInWorksheet(string columnName, uint rowIndex, WorksheetPart worksheetPart)
{
Worksheet worksheet = worksheetPart.Worksheet;
SheetData sheetData = worksheet.GetFirstChild<SheetData>();
string cellReference = columnName + rowIndex;
// 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)
{
row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
}
else
{
row = new Row() { RowIndex = rowIndex };
sheetData.Append(row);
}
// If there is not a cell with the specified column name, insert one.
if (row.Elements<Cell>().Where(c => c.CellReference.Value == columnName + rowIndex).Count() > 0)
{
return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First();
}
else
{
// Cells must be in sequential order according to CellReference.
// Determine where to insert the new cell.
Cell refCell = null;
Cell newCell = new Cell() { CellReference = cellReference };
row.InsertBefore(newCell, refCell);
worksheet.Save();
return newCell;
}
}