我最近开始研究Open XML SDK 2.0.
我想知道是否有更好的文档(而不是开放的xml sdk2.0本身)或任何其他资源来学习使用Open XML SDK?
我有一个Excel 2007电子表格,我用OpenXML SDK 2编辑.我删除了一些行等.我想知道如何将Spreadsheetdocument保存到另一个文件名.
我正在尝试编写一些代码来生成Excel电子表格,我不确定CellValues.InlineString和CellValues.String在单元格上插入文本有什么区别.
我要用这个:
private void UpdateCellTextValue(Cell cell,string cellValue)
{
InlineString inlineString = new InlineString();
Text cellValueText = new Text { Text = cellValue };
inlineString.AppendChild(cellValueText);
cell.DataType = CellValues.InlineString;
cell.AppendChild(inlineString);
}
Run Code Online (Sandbox Code Playgroud)
这个
private void UpdateCellTextValue(Cell cell, string cellValue)
{
cell.CellValue = new CellValue(cellValue);
cell.DataType = new EnumValue<CellValues>(CellValues.String);
}
Run Code Online (Sandbox Code Playgroud)
或者只是这个(InsertSharedStringItem返回新插入的共享字符串项的Id)
private void SetCellSharedTextValue(Cell cell,string cellValue)
{
int stringId = InsertSharedStringItem(cellValue);
cell.CellValue = new CellValue(stringId.ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
}
Run Code Online (Sandbox Code Playgroud) 我有一个Excel 2010电子表格,其中包含3个名为Sheet1,Sheet2和Sheet3的工作表.
我正在尝试按名称获取对工作表的引用.
我正在使用代码:
using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(FileName, true))
{
//Access the main Workbook part, which contains all references
WorkbookPart workbookPart = myWorkbook.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.Last();
// this gives me Sheet1
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
}
Run Code Online (Sandbox Code Playgroud)
我试图获得Sheet2的引用,但我找不到这样做的方法.
我越走越近了,但我还没到那里:
var x = workbookPart.Workbook.Sheets.Where(s=> s.GetAttribute("name", "").Value == "Sheet2").FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
这让我得到了工作表的参考,但没有给工作表上的数据
谢谢
使用c#处理Open XML 2.0以解析大型Excel文件.问题我遇到的是我正在解析的单元格没有DataType I然后检查NumberFormatId以确定它是十进制,数字还是日期.我正在寻找数字/小数与日期的确切NumberFormatId范围.他们似乎到处都是一些数字/小数的格式为189,212,214,305,日期的值为185,194,278等.有谁知道规范是否定义了这些范围?
编辑 - 更多信息
下面是xl文件夹中style.xml文件的数字格式194的示例.
excel表来自世界不同地区,所以我认为数字格式不同,但它们是否重叠?numFmtId 194将不同于不同文化设置的日期吗?
下面是我如何将像"40574"这样的c.CellValues转换为日期,但问题是如何知道"40574"是日期而不是数字?
DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
Run Code Online (Sandbox Code Playgroud)
目前我通过检查是否没有DataType而不是检查CellFormat来做这个,但是当我的检查中没有一些NumberFormatId时会出现问题.
private Object FormatCellValue(Cell c, SharedStringTable ssTable, CellFormats cellFormats)
{
if (c.CellValue != null)
{
// If there is no data type, this must be a string that has been formatted as a number
if (c.DataType == null)
{
CellFormat cf;
if (c.StyleIndex == null)
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(0);
}
else
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(Convert.ToInt32(c.StyleIndex.Value));
}
if ((cf.NumberFormatId >= 14 && cf.NumberFormatId <= 22) ||
(cf.NumberFormatId >= 165 …Run Code Online (Sandbox Code Playgroud) 我有一个电子表格文档,其中包含182列.我需要将电子表格数据放在数据表中,逐个标签,但我需要找出,因为我正在添加每个选项卡中的数据,选项卡名称是什么,并将选项卡名称添加到数据表中的列.
这就是我设置数据表的方法.
然后我循环进入工作簿并深入到sheetData对象并遍历每一行和每列,获取单元格数据.
DataTable dt = new DataTable();
for (int i = 0; i <= col.GetUpperBound(0); i++)
{
try
{
dt.Columns.Add(new DataColumn(col[i].ToString(), typeof(string)));
}
catch (Exception e)
{
MessageBox.Show("Uploader Error" + e.ToString());
return null;
}
}
dt.Columns.Add(new DataColumn("SheetName", typeof(string)));
Run Code Online (Sandbox Code Playgroud)
但是,在我用于数据表的字符串数组的末尾,我需要添加选项卡名称.当我在Open XML中的表格中循环时,如何找到选项卡名称?
到目前为止,这是我的代码:
using (SpreadsheetDocument spreadSheetDocument =
SpreadsheetDocument.Open(Destination, false))
{
WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
Workbook workbook = spreadSheetDocument.WorkbookPart.Workbook;
Sheets sheets =
spreadSheetDocument
.WorkbookPart
.Workbook
.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
OpenXmlElementList list = sheets.ChildElements;
foreach (WorksheetPart worksheetpart in workbook.WorkbookPart.WorksheetParts)
{
Worksheet worksheet = worksheetpart.Worksheet; …Run Code Online (Sandbox Code Playgroud) 我一直在谷歌上搜索并在网站上搜索答案,但我找不到解决方案 - 各地人们大多讨论如何在文档中添加新的数字格式并应用它.
我需要的是将单元格值作为带有应用格式的字符串 - 即与Excel显示的字符串相同.
我已经认为没有简单的方法或内置函数可以返回单元格的现成格式化值.
所以在我看来,要获得我需要做两件事的价值:1.获取格式字符串.2.使用此字符串格式化单元格值.
但是这两个步骤都有问题.
可以轻松获取包含NumberFormatId的CellFormat实例:
CellFormat cellFormat = (CellFormat) document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ElementAt(cell.StyleIndex);
Run Code Online (Sandbox Code Playgroud)
但是,如果id对应于标准预定义格式之一,如何使用此NumberFormatId获取格式字符串?(即低于160)它们不在电子表格文档中,我无法相信它们应该在应用程序中进行硬编码.
此外,一旦获得格式字符串,如何将其应用于单元格值?到目前为止我理解,代码应该检查单元格值的类型,如果是数字 - 使用格式字符串将其转换为字符串.
我发现这个页面提到了使用Microsoft.Office.Excel.Interop,但我更愿意继续使用OpenXML SDK.
总的来说,我很惊讶在Web上找到这个问题的确切答案是如此困难,因为我认为这将是许多开发人员在日常工作中需要的东西.
我讨厌借助StackOverflow这样(看似)基本的东西,但我在过去的几个小时里一直在和微软打架,似乎已经走到了尽头.我正在尝试阅读(大)Excel 2007+电子表格,谷歌已经告诉我,使用OpenXml SDK是一个非常受欢迎的选择.所以我给了这个东西一个镜头,读了一些教程,检查了微软自己的库页面,并且得到了很少的东西.
我正在使用一个小测试电子表格,只有一列数字和一个字符串 - 大规模测试将在稍后进行.我尝试了几种类似于我即将发布的实现,但没有一种实现读取数据.下面的代码主要来自另一个StackOverflow线程,它似乎已经工作了 - 对我来说不是这样.我想我会让你们检查/调试/帮助这个版本,因为它可能比我今天写的任何东西都要少.
static void ReadExcelFileSAX(string fileName)
{
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(fileName, true))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
OpenXmlPartReader reader = new OpenXmlPartReader(worksheetPart);
string text;
string rowNum;
while (reader.Read())
{
if (reader.ElementType == typeof(Row))
{
do
{
if (reader.HasAttributes)
{
rowNum = reader.Attributes.First(a => a.LocalName == "r").Value;
Console.Write("rowNum: " + rowNum); //we never even get here, I tested it with a breakpoint
}
} while (reader.ReadNextSibling()); // Skip to the …Run Code Online (Sandbox Code Playgroud) 我编写了一个使用OpenXML生成Excel文件的代码.下面是在Excel中生成列的代码.
Worksheet worksheet = new Worksheet();
Columns columns = new Columns();
int numCols = dt1.Columns.Count;
for (int col = 0; col < numCols; col++)
{
Column c = CreateColumnData((UInt32)col + 1, (UInt32)numCols + 1, 20.42578125D);
columns.Append(c);
}
worksheet.Append(columns);
Run Code Online (Sandbox Code Playgroud)
另外,我在下面尝试创建列.
Column c = new Column
{
Min = (UInt32Value)1U,
Max = (UInt32Value)1U,
Width = 25.42578125D,
BestFit = true,
CustomWidth = true
};
Run Code Online (Sandbox Code Playgroud)
我认为使用BestFit它应该工作.但它没有设置自动尺寸.
任务
从数据导入excel到DataTable
问题
将跳过不包含任何数据的单元格,并将具有该行中数据的下一个单元格用作空列的值.例如
A1是空的A2有一个值Tom,然后在导入数据A1得到的值A2和A2保持空白
为了说清楚,我在下面提供一些屏幕截图
这是excel数据
码
public class ImportExcelOpenXml
{
public static DataTable Fill_dataTable(string fileName)
{
DataTable dt = new DataTable();
using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(fileName, false))
{
WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
string relationshipId = sheets.First().Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
Worksheet workSheet = worksheetPart.Worksheet;
SheetData sheetData = workSheet.GetFirstChild<SheetData>();
IEnumerable<Row> rows = sheetData.Descendants<Row>();
foreach (Cell cell in rows.ElementAt(0))
{
dt.Columns.Add(GetCellValue(spreadSheetDocument, …Run Code Online (Sandbox Code Playgroud)