我需要遍历书签开始和书签结束标记之间的节点。问题似乎分解为树遍历,但我无法确定正确的算法。书签开始和结束元素是非复合节点(没有子节点)并且可能出现在树中的任意深度。书签开始也不能保证在相同的深度。
如果您为文档绘制树结构,我想检查开始和结束书签之间的所有节点。我认为一种遍历从节点 x 开始到节点 y 结束的不平衡树的算法是可行的。这听起来可行还是我遗漏了什么。
如果这是可行的,你能指出我可以完成返回节点的树遍历的方向吗?
我正在尝试阅读 Word 2007 docx 文档。
该文档在 Word 中看起来不错,但是当我尝试使用我的代码读取 id 时,所有 Run 对象都将 RunProperites 设置为 null。
我最感兴趣的属性是 RunProperies.FontSize,但不幸的是它也是 null,我可以访问的唯一属性是 InnerText。
我的代码如下所示:
using (WordprocessingDocument doc = WordprocessingDocument.Open(filename, true))
{
MainDocumentPart mainPart = doc.MainDocumentPart;
IList<Paragraph> paragraphList = doc.MainDocumentPart.Document.Body.Elements<Paragraph>().ToList<Paragraph>();
foreach (Paragraph pr in paragraphList)
{
IList<Run> runList = pr.Elements<Run>().ToList<Run>();
foreach (Run r in runList)
{
// Some logic
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经将我的文档最小化到尽可能简单,它看起来像这样http://dl.dropbox.com/u/204110/test.docx
我有类似的文件,可以很好地阅读。OpenXML SDK 2 中是否可能存在错误?
有没有人遇到过类似的问题?任何帮助将不胜感激。谢谢你!
我正在使用 OpenXML SDK 以编程方式用<w:sdt/>OpenXML (WordProcessingML) 标记块替换一些元素。
例如,我有一个包含以下内容的段落:
<w:p>
<w:run><w:text> Text before </w:text></w:run>
<w:sdt><w:sdtPr> ...</w:sdtPr><w:sdtContent>...</w:sdtContent></w:sdt>
<w:run><w:text> Text after </w:text></w:run>
</w:p>
Run Code Online (Sandbox Code Playgroud)
还有一个结构如下的表:
<w:tbl>
<w:tblPr>...</w:tblPr>
<w:tblGrid> ... gridCol elements ...</w:tblGrid>
<w:tr>
<w:trPr>...</w:trPr>
<w:tc>
<w:tcPr>...</w:tcPr>
<w:p> Cell contents </w:p>
</w:tc>
<w:tc>
<w:tcPr>...</w:tcPr>
<w:p> Cell contents </w:p>
</w:tc>
</w:tr>
</w:tbl>
Run Code Online (Sandbox Code Playgroud)
基本上我想<w:sdt/>用表格标记替换段落中的元素。问题是我不能只是替换它,因为它会创建一个无效的文档(另一个段落元素中包含段落的表格无效)。
我想要得到的结果是这样的:
<w:p>
<w:run><w:text> Text before </w:text></w:run>
</w:p>
<w:tbl>
<w:tblPr>...</w:tblPr>
<w:tblGrid> ... gridCol elements ...</w:tblGrid>
<w:tr>
<w:trPr>...</w:trPr>
<w:tc>
<w:tcPr>...</w:tcPr>
<w:p> Cell contents </w:p>
</w:tc>
<w:tc>
<w:tcPr>...</w:tcPr>
<w:p> Cell contents </w:p>
</w:tc> …Run Code Online (Sandbox Code Playgroud) 我正在使用OpenXml生成excel文件,在游过大量不同的示例代码和SDK Productivity Tool之后,终于设法得到了我想要的东西.只有一件事我无法解决.当我使用Excel打开文件并尝试将单元格复制/粘贴到另一个Excel文件时,我得到"该命令不能用于多个选择".它绝对不是一个非相邻的选择问题,因为即使只有一个单元格也无法做到.此外,如果我用Excel保存我的文件并重新打开它,问题就会消失,所以我认为它可能与我创建文件的方式有关.任何建议,将不胜感激.这是我用来生成文件的代码:
public class ExcelGenerator
{
#region Fields
private List<Tuple<DbDataReader, string>> datasource;
private string[] cellReferences = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
private SpreadsheetDocument workbook;
Hashtable stringItemIndexMap;
int nextIndex;
private uint numberStyleID;
private uint decimalStyleID;
private uint textStyleID;
private uint headerTextStyleID;
#endregion
#region Constructors
public ExcelGenerator(DbDataReader reader, string sheetName) : this(new List<Tuple<DbDataReader, string>>() { new …Run Code Online (Sandbox Code Playgroud) 如何将org.docx4j.openpackaging.packages.WordprocessingMLPackage实例保存到ByteArrayInputStream中,然后可以从服务器下载.
谢谢.
请澄清我的疑问
WordML/DOCX默认单位测量是像素或点或EMU或英寸..?
我正在使用openXMLAsp.net和c#创建一个Excel workbook,我要求使所有工作表的抬头行都应为粗体。
WorkbookStylesPart stylesPart = workbookpart.AddNewPart<WorkbookStylesPart>();
stylesPart.Stylesheet = CreateStylesheet();
stylesPart.Stylesheet.Save();
}
private static Stylesheet CreateStylesheet()
{
Stylesheet ss = new Stylesheet();
Fonts fts = new Fonts();
DocumentFormat.OpenXml.Spreadsheet.Font ft = new DocumentFormat.OpenXml.Spreadsheet.Font();
Bold fbld = new Bold();
FontName ftn = new FontName();
ftn.Val = "Calibri";
DocumentFormat.OpenXml.Spreadsheet.FontSize ftsz = new DocumentFormat.OpenXml.Spreadsheet.FontSize();
ftsz.Val = 11;
ft.FontName = ftn;
ft.FontSize = ftsz;
ft.Bold = fbld;
fts.Append(ft);
fts.Count = (uint)fts.ChildElements.Count;
ss.Append(fts);
return ss;
}
Run Code Online (Sandbox Code Playgroud)
它正在制作所有单元格bold,我缺少将其应用于特定单元格的代码row/cells
在此先感谢,AR
我有很多使用扩展XML保存的Office Open XML(OOXML)文件,我试图将这些文件插入到MySQL数据库中.我可以连接好,我已经能够使用相同的语法将字符串插入到不同的数据库中.但是当我尝试将XML文件插入数据库中的blob字段时,它告诉我我的语法有问题.由于文件的格式,我应该做些什么特别的事吗?
public Insertion(Connection conn) throws SQLException, FileNotFoundException{
System.out.println("Trying to insert Data..");
String filePath1 = "C:/Users/SAVAGD05/Documents/RMP/Section1.XML";
InputStream inputStream1 = new FileInputStream(new File(filePath1));
String filePath2 = "C:/Users/SAVAGD05/Documents/RMP/Section1.XML";
InputStream inputStream2 = new FileInputStream(new File(filePath2));
String filePath3 = "C:/Users/SAVAGD05/Documents/RMP/Section1.XML";
InputStream inputStream3 = new FileInputStream(new File(filePath3));
System.out.println("It did this part");
String SQL = "INSERT INTO (1,2,3) values(?,?,?)";
PreparedStatement statement = conn.prepareStatement(SQL);
statement.setBlob(1, inputStream1);
statement.setBlob(2, inputStream2);
statement.setBlob(3, inputStream3);
statement.executeUpdate();
System.out.println("Data inserted.");
conn.close();
System.out.println("Connection Closed");
System.out.println("Have a Nice Day and Goodbye.");
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
"线程中的异常"主" …
使用OpenXML SDK将边框应用于合并的单元格区域时,边框仅显示合并范围中的第一个(左上角)单元格.我完全不知道,这让我发疯.使用生产力工具,我找不到任何有意义的差异,我有什么和预期的工作.这是我为样式表生成的XML:
<x:borders count="2" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:border>
<x:left />
<x:right />
<x:top />
<x:bottom />
<x:diagonal />
</x:border>
<x:border>
<x:left />
<x:right />
<x:top />
<x:bottom style="thick">
<x:color auto="1" />
</x:bottom>
<x:diagonal />
</x:border>
</x:borders>
<x:cellXfs xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:xf fontId="0" />
<x:xf fontId="1" fillId="2" applyFont="1" applyFill="1" />
<x:xf borderId="1" applyBorder="1" />
</x:cellXfs>
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一切,在边界之前,之后等应用合并.
下面给出了一个合并功能,该功能旨在合并文件夹中的所有docx文件并生成合并的文件。
public void Merge()
{
try
{
string sid = Request.QueryString["studid"];
string stud = sid.ToString();
string ds = HttpContext.Current.Server.MapPath(("~\\StudentBinder") + "\\Temp4\\");
if (Directory.Exists(ds))
{
DirectoryInfo d = new DirectoryInfo(ds);
FileInfo[] Files = d.GetFiles("*" + stud + "*.docx");
// stud added for differentiating b/w users
string[] filepaths = new string[Files.Length];
int index = 0;
foreach (FileInfo file in Files)
{
filepaths[index] = file.Name;
index++;
}
using (WordprocessingDocument myDoc = WordprocessingDocument.Open(Server.MapPath(filepaths[0]), true))
{
for (int i = 1; i < filepaths.Length; i++) …Run Code Online (Sandbox Code Playgroud)