C# 从右到左打开XML Sheetview
我需要在ExporToExcel类中添加SheetView设置。但导出后,即使创建了工作表并设置了SheetView设置,也会显示Excel单元格内容为空。我检查了这个网站和其他网站上的所有帖子,但没有成功。每次我收到一个文件损坏的消息或电子表格是空的C# 从右到左打开XML Sheetview,c#,excel,openxml,C#,Excel,Openxml,我需要在ExporToExcel类中添加SheetView设置。但导出后,即使创建了工作表并设置了SheetView设置,也会显示Excel单元格内容为空。我检查了这个网站和其他网站上的所有帖子,但没有成功。每次我收到一个文件损坏的消息或电子表格是空的 private static void WriteExcelFile(DataSet ds, SpreadsheetDocument spreadsheet) { spreadsheet.AddWorkbookPart(); sp
private static void WriteExcelFile(DataSet ds, SpreadsheetDocument spreadsheet)
{
spreadsheet.AddWorkbookPart();
spreadsheet.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
spreadsheet.WorkbookPart.Workbook.Append(new BookViews(new WorkbookView()));
WorkbookStylesPart workbookStylesPart = spreadsheet.WorkbookPart.AddNewPart<WorkbookStylesPart>("rIdStyles");
//Stylesheet stylesheet = new Stylesheet();
workbookStylesPart.Stylesheet = CreateStylesheet();
uint worksheetNumber = 1;
Sheets sheets = spreadsheet.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
foreach (DataTable dt in ds.Tables)
{
string worksheetName = dt.TableName;
WorksheetPart newWorksheetPart = spreadsheet.WorkbookPart.AddNewPart<WorksheetPart>();
Sheet sheet = new Sheet() { Id = spreadsheet.WorkbookPart.GetIdOfPart(newWorksheetPart), SheetId = worksheetNumber, Name = worksheetName };
newWorksheetPart.Worksheet = new Worksheet(new SheetViews(new SheetView() { WorkbookViewId=0,RightToLeft=true}),new SheetData());
newWorksheetPart.Worksheet.Save();
sheets.Append(sheet);
WriteDataTableToExcelWorksheet(dt, newWorksheetPart);
worksheetNumber++;
}
spreadsheet.WorkbookPart.Workbook.Save();
}
private static void WriteDataTableToExcelWorksheet(DataTable dt, WorksheetPart worksheetPart)
{
OpenXmlWriter writer = OpenXmlWriter.Create(worksheetPart, Encoding.ASCII);
writer.WriteStartElement(new Worksheet());
writer.WriteStartElement(new SheetData());
string cellValue = "";
int numberOfColumns = dt.Columns.Count;
bool[] IsNumericColumn = new bool[numberOfColumns];
bool[] IsDateColumn = new bool[numberOfColumns];
string[] excelColumnNames = new string[numberOfColumns];
for (int n = 0; n < numberOfColumns; n++)
excelColumnNames[n] = GetExcelColumnName(n);
//
// Create the Header row in our Excel Worksheet
//
uint rowIndex = 1;
writer.WriteStartElement(new Row { RowIndex = rowIndex });
for (int colInx = 0; colInx < numberOfColumns; colInx++)
{
DataColumn col = dt.Columns[colInx];
AppendTextCell(excelColumnNames[colInx] + "1", col.ColumnName, ref writer);
IsNumericColumn[colInx] = (col.DataType.FullName == "System.Decimal") || (col.DataType.FullName == "System.Int32") || (col.DataType.FullName == "System.Double") || (col.DataType.FullName == "System.Single");
IsDateColumn[colInx] = (col.DataType.FullName == "System.DateTime");
}
writer.WriteEndElement(); // End of header "Row"
double cellNumericValue = 0;
foreach (DataRow dr in dt.Rows)
{
++rowIndex;
writer.WriteStartElement(new Row { RowIndex = rowIndex });
for (int colInx = 0; colInx < numberOfColumns; colInx++)
{
cellValue = dr.ItemArray[colInx].ToString();
cellValue = ReplaceHexadecimalSymbols(cellValue);
if (IsNumericColumn[colInx])
{
cellNumericValue = 0;
if (double.TryParse(cellValue, out cellNumericValue))
{
cellValue = cellNumericValue.ToString();
AppendNumericCell(excelColumnNames[colInx] + rowIndex.ToString(), cellValue, ref writer);
}
}
else if (IsDateColumn[colInx])
{
// This is a date value.
DateTime dtValue;
string strValue = "";
if (DateTime.TryParse(cellValue, out dtValue))
strValue = dtValue.ToShortDateString();
AppendTextCell(excelColumnNames[colInx] + rowIndex.ToString(), strValue, ref writer);
}
else
{
AppendTextCell(excelColumnNames[colInx] + rowIndex.ToString(), cellValue, ref writer);
}
}
writer.WriteEndElement(); // End of Row
}
writer.WriteEndElement(); // End of SheetData
writer.WriteEndElement(); // End of worksheet
writer.Close();
}
private static void WriteExcelFile(数据集ds、电子表格文档电子表格)
{
电子表格。AddWorkbookPart();
spreadsheet.WorkbookPart.Workbook=newdocumentformat.OpenXml.spreadsheet.Workbook();
电子表格.WorkbookPart.Workbook.Append(newbookview(newworkbookview()));
WorkbookStylesPart WorkbookStylesPart=电子表格.WorkbookPart.AddNewPart(“rIdStyles”);
//样式表样式表=新样式表();
workbookStylesPart.Stylesheet=CreateStylesheet();
单元工作表编号=1;
Sheets Sheets=电子表格.WorkbookPart.Workbook.AppendChild(新工作表());
foreach(ds.表中的数据表dt)
{
字符串工作表名称=dt.TableName;
WorksheetPart newWorksheetPart=电子表格.WorkbookPart.AddNewPart();
Sheet Sheet=new Sheet(){Id=spreadsheet.WorkbookPart.GetIdOfPart(newWorksheetPart),SheetId=worksheetNumber,Name=worksheetName};
newWorksheetPart.Worksheet=new工作表(new SheetView(){workbookview=0,RightToLeft=true}),new SheetData());
newWorksheetPart.Worksheet.Save();
附页(页);
已写入状态到Excel工作表(dt,新工作表部分);
工作表编号++;
}
电子表格.WorkbookPart.Workbook.Save();
}
私有静态无效写入StatableToExcelWorksheet(数据表dt,工作表部分工作表部分)
{
OpenXmlWriter=OpenXmlWriter.Create(工作表部分,Encoding.ASCII);
writer.writeStart元素(新工作表());
writer.writeStarElement(新的SheetData());
字符串cellValue=“”;
int numberOfColumns=dt.Columns.Count;
bool[]IsNumericColumn=新bool[numberOfColumns];
bool[]IsDateColumn=新bool[numberOfColumns];
string[]excelColumnNames=新字符串[numberOfColumns];
对于(int n=0;n
使工作表从右到左读取的代码是正确的。但是,WriteDataTableToExcelWorksheet
和CreateStylesheet
的代码不完整,存在一些问题
我在上找到了WriteDataableToExcelWorkbench
的原始代码。然后,我用OpenXMLProductivity工具将一个普通的Excel文件反向设计为C#代码,并重用一个方法来创建一个新的样式表
使用此代码生成的excel文件如下所示:
。有一个包装器WPF应用程序可以指导在您的机器上生成文件的位置
这是一本书