我有一个电子表格文档,其中包含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上找到这个问题的确切答案是如此困难,因为我认为这将是许多开发人员在日常工作中需要的东西.
我需要使用现有表(例如,3列)打开现有Word文档(.docx)并向该表添加新行.有没有办法做到这一点?我正在使用Open XML
我正在创建这样的表(第一次):
Table tbl = new Table();
// Set the style and width for the table.
TableProperties tableProp = new TableProperties();
TableStyle tableStyle = new TableStyle() { Val = "TableGrid" };
// Make the table width 100% of the page width.
TableWidth tableWidth = new TableWidth() { Width = "5000", Type = TableWidthUnitValues.Pct };
// Apply
tableProp.Append(tableStyle, tableWidth);
tbl.AppendChild(tableProp);
// Add 3 columns to the table.
TableGrid tg = new TableGrid(new GridColumn(), new GridColumn(), new GridColumn());
tbl.AppendChild(tg);
// Create …Run Code Online (Sandbox Code Playgroud) 我一直在寻找一段时间,似乎无法找到如何做到这一点.我有一张excel表,我正在使用OpenXML阅读.现在正常情况是循环遍历行然后循环遍历单元格以获取值,这很好.但是随着值的增加,我需要单元格的位置,格式为(rowindex,ColumnIndex).我已经设法得到了rowIndex,但似乎无法弄清楚索引列.
我实际上认为这很容易,但显然它不是.
我正在使用EPPlus从excel读取数据到datable.
在阅读了包含10行记录的Excel工作表后,我通过删除现有数据并仅保留一行数据来修改Excel工作表.但是当我正在读取修改后的excel时,它仍然会将10行(带有值1并保留为空字段)读取到数据表中.
怎么能限制这个?我正在使用以下代码来阅读Excel.
using (var pck = new OfficeOpenXml.ExcelPackage())
{
using (var stream = File.OpenRead(FilePath))
{
pck.Load(stream);
}
var ws = pck.Workbook.Worksheets.First();
bool hasHeader = true; // adjust it accordingly(this is a simple approach)
foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
{
DSClientTransmittal.Tables[0].Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
}
var startRow = hasHeader ? 2 : 1;
for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
{
//var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
var wsRow = ws.Cells[rowNum, …Run Code Online (Sandbox Code Playgroud) 2009年9月28日,Apache POI项目发布了3.5版本,正式支持Office 2007中引入的OOXML格式,如DOCX和XLSX.
请提供一个代码示例,用于以纯文本格式提取DOCX文件的内容,忽略任何样式或格式.
我问这个是因为我无法找到任何覆盖新OOXML支持的Apache POI示例.
我需要一些东西作为占位符.我起初将内容控制视为一种解决方案,但我遇到了一些问题.
然后我考虑将.docx中的CustomXML添加到其中,但由于i4i的诉讼而拒绝了.
然后我决定通过OpenXML SDK 2.0简单地改变内容控制的文本,但即使它如此标记,内容控制也不会消失.我想它不知道文本发生了变化,除非它发生在单词内部.
我或许可以删除CC并放置文本,但我担心它可能带来的格式和样式问题,而且它会违反内容控制的目的.
然后我开始想知道我是否可以定义Word可以识别的自己的占位符.也许通过积木.它不需要做任何事情,除了易于使用OpenXML找到并以某种方式可标记,所以我知道用什么来替换它.我不确定可以用Building Blocks做什么,但我希望它能够做到.
不确定哪种解决方案最适合我,但我需要的是:
a)一些容易放在模板中的东西,也许是预定义的内容控件占位符,你可以放置在你想要的地方并按照你喜欢的样式.
b)添加数据后,删除所有占位符,不再修改.它保持在占位符中定义的样式/格式.
要收回,我需要回答
如何在OpenXML SDK中编辑内容控件,以便在添加文本后删除它们.
-要么-
我可以为Word文档定义自己的自定义OpenXML标记,然后我可以替换它吗?
如何使用带有OpenXML格式的 c#读取xls和xlsx文件而不使用OLEDB连接.我正在寻找Open XML格式程序.
下面是我使用OLEDB预处理的代码.但我正在寻找OpenXML格式.
public static DataTable ConvretExcelToDataTable(string FilePath)
{
string strConn = string.Empty;
if (FilePath.Trim().EndsWith(".xlsx"))
{
strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", FilePath);
}
else if (FilePath.Trim().EndsWith(".xls"))
{
strConn = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";", FilePath);
}
OleDbConnection conn = null;
OleDbCommand cmd = null;
OleDbDataAdapter da = null;
DataTable dt = new DataTable();
try
{
conn = new OleDbConnection(strConn);
conn.Open();
cmd = new OleDbCommand(@"SELECT * FROM [Sheet1$]", conn);
cmd.CommandType = CommandType.Text;
da = new OleDbDataAdapter(cmd); …Run Code Online (Sandbox Code Playgroud) 标题说明了我得到的错误.我试图使用OpenXml 隐藏 word doc中的所有文本.目前,当我尝试追加段落属性时,我收到上述错误.我在网上找不到这个错误.
返回错误的代码
using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(mDoc_copy, true))
{
// Manage namespaces to perform XPath queries.
NameTable nt = new NameTable();
XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
nsManager.AddNamespace("w", wordmlNamespace);
// Get the document part from the package.
// Load the XML in the document part into an XmlDocument instance.
XmlDocument xdoc = new XmlDocument(nt);
xdoc.Load(wdDoc.MainDocumentPart.GetStream());
MainDocumentPart main = wdDoc.MainDocumentPart;
IEnumerable<OpenXmlElement> elem = main.Document.Body.Descendants().ToList();
Paragraph p;
ParagraphProperties pp = new ParagraphProperties();
ParagraphMarkRunProperties prmp = new ParagraphMarkRunProperties();
Vanish v = …Run Code Online (Sandbox Code Playgroud) 我有一个.xlsx电子表格,在表格1的左上角单元格中有一个数字.
Excel UI显示:
-130.98999999999
Run Code Online (Sandbox Code Playgroud)
这在公式栏中可见,即不受包含单元格设置为显示的小数位数的影响.这是Excel将为此单元格显示的最准确数字.
在底层XML中,我们有:
<v>-130.98999999999069</v>
Run Code Online (Sandbox Code Playgroud)
当尝试使用Apache POI读取工作簿时,它通过Double.valueOf从XML提供数字,并提供:
-130.9899999999907
Run Code Online (Sandbox Code Playgroud)
不幸的是,这与用户在Excel中看不到的数字相同.任何人都可以指向一个算法来获取用户在Excel中看到的相同数字吗?
到目前为止,我的研究表明,Excel 2007文件格式使用了IEE754浮点的略微非标准版本,其中值空间不同.我相信Excel的浮点,这个数字落在边界的另一边进行舍入,因此就像向下舍入而不是向上.
openxml ×10
c# ×8
excel ×4
openxml-sdk ×4
.net ×2
apache-poi ×2
ms-word ×2
appendchild ×1
docx ×1
epplus ×1
excel-import ×1
java ×1
xls ×1
xlsx ×1