标签: openxml

使用OpenXml sdk 2.0创建Excel文档

我使用OpenXml SDK 2.0创建了一个Excel文档,现在我必须设置它的样式,但我不能.

我不知道如何绘制背景颜色或更改不同单元格中的字体大小.

我创建单元格的代码是:

private static Cell CreateTextCell(string header, string text, UInt32Value index)
{
    Cell c = new Cell();
    c.DataType = CellValues.InlineString;
    c.CellReference = header + index;
    InlineString inlineString = new InlineString();
    DocumentFormat.OpenXml.Spreadsheet.Text t = new DocumentFormat.OpenXml.Spreadsheet.Text();
    t.Text = text;
    inlineString.AppendChild(t);
    c.AppendChild(inlineString);
    return c;
} 
Run Code Online (Sandbox Code Playgroud)

c# excel openxml spreadsheetml

16
推荐指数
2
解决办法
4万
查看次数

Open XML SDK的初学者示例代码?

我最近开始研究Open XML SDK 2.0.

我想知道是否有更好的文档(而不是开放的xml sdk2.0本身)或任何其他资源来学习使用Open XML SDK?

ms-office openxml openxml-sdk

16
推荐指数
2
解决办法
3万
查看次数

打开XML SDK 2.0以按名称访问excel 2010工作表

我有一个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# openxml excel-2010 openxml-sdk

16
推荐指数
2
解决办法
1万
查看次数

C#Open XML 2.0 NumberFormatId范围

使用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)

c# openxml openxml-sdk

16
推荐指数
1
解决办法
3万
查看次数

OpenXML库(ClosedXML的替代品)

有哪些库可以扩展OpenXML(或者为OpenXML添加一种抽象层),类似于ClosedXML?

我正在寻找至少1.0版本的商业或免费软件工具.

先感谢您.

.net office-2007 openxml closedxml

15
推荐指数
3
解决办法
2万
查看次数

ClosedXML - 创建多个数据透视表

我正在尝试将一些数据导出到excel表,S1其数据将在接下来的两个表中显示为Pivoted视图S2 and S3.我能够创建一个单一的枢轴,它完美无缺.但是当我创建两个枢轴时,后续的Excel文件呈现为损坏.

腐败我的意思是,

点击是,我得到了 -

腐败

这是我用来创建枢轴的代码 -

using XL = ClosedXML.Excel;
...
XL.XLWorkbook wb = new XL.XLWorkbook();
dsData = Session["ExportData"] as DataSet;

var sheet1 = wb.Worksheets.Add("output table");
sheet1.Cell(1, 1).InsertTable(dsData.Tables[0], "output table", true);

// sheet1 is the reference sheet S1
var dataRange = sheet1.RangeUsed();

// First Pivot
XL.IXLWorksheet ptSheet1 = wb.Worksheets.Add("S2");

var pt1 = ptSheet1.PivotTables.AddNew("PivotTable1", ptSheet.Cell(3, 1), dataRange);


pt1.ReportFilters.Add("CX");

pt1.RowLabels.Add("C1");
pt1.RowLabels.Add("C2");
pt1.RowLabels.Add("C3");
pt1.RowLabels.Add("C4");

pt1.ColumnLabels.Add("CL1");
pt1.ColumnLabels.Add("CL2");
pt1.ColumnLabels.Add("CL3");

pt1.Values.Add("V").SummaryFormula = XL.XLPivotSummary.Sum;


// Second Pivot
XL.IXLWorksheet ptSheet2 = wb.Worksheets.Add("S3"); …
Run Code Online (Sandbox Code Playgroud)

c# excel openxml export-to-excel closedxml

15
推荐指数
1
解决办法
2282
查看次数

添加自动筛选器和排序会导致Excel崩溃

我正在开发一个应用程序,您可以使用OpenXML将一些数据导出到Excel文件.除了使用自动过滤器,一切正常.我们的想法是在数据主体中添加一个自动过滤器,以便用户自动拥有对数据进行过滤和排序的控件.所以在代码中,我做这样的事情:

var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference ) };
worksheet.AppendChild(filter);
Run Code Online (Sandbox Code Playgroud)

在导出的XLSX中,它看起来像这样:

<x:autoFilter ref="A4:L33" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" />
Run Code Online (Sandbox Code Playgroud)

而且它加入之间的工作sheetDatamergeCells.

然后,我可以在Excel中打开此过滤器,它工作正常.预计如果您尝试对列进行排序,列将排序,然后Excel崩溃.保存和重新加载文件(强制Excel清除所有内容)不能解决问题.但是,如果您首先应用过滤器(比如过滤一个列> 10,然后删除该过滤器,您现在可以排序而不会崩溃.我在应用过滤器并删除它后保存了一个文件,现在该文件很好,但是查看XML对于"已修复"的文件,我没有看到任何明显的区别.

有谁知道可能导致问题的原因是什么?除了将其添加到工作表之外,在应用自动过滤器时还有什么我应该做的吗?

注意:我们使用的是Excel 2010(版本14.0.7153.5000)

这是一个示例文件(单击下载,它将下载为.zip.重命名为.xlsx在Excel中打开.启用编辑,选择其中一列并尝试排序).

编辑:再玩这个.如果您在Excel中重新保存文件,它仍然会被破坏.但是,如果您首先应用过滤器(然后清除它)然后在Excel中重新保存,您将获得一个工作文件.仔细观察两个文件(仍然破坏的重新存档文件和现在正在运行的文件),我注意到在应用过滤器(并清除)后,这个额外的位被添加到工作簿中:

  <x:definedNames>
    <x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName>
  </x:definedNames>
Run Code Online (Sandbox Code Playgroud)

不确定这可能是不是......

c# excel openxml

15
推荐指数
1
解决办法
2139
查看次数

使用OpenXmlReader

我讨厌借助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)

c# openxml openxml-sdk

14
推荐指数
1
解决办法
1万
查看次数

OpenXML:Excel中的自动调整列宽

我编写了一个使用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它应该工作.但它没有设置自动尺寸.

c# openxml openxml-sdk

14
推荐指数
3
解决办法
3万
查看次数

使用Open Xml替换Word文档中的文本

我已经从word模板创建了一个docx文件,现在我正在访问复制的docx文件,并希望用某些其他数据替换某些文本.

我无法获得如何从doument主要部分访问文本的提示?

任何帮助都会很明显.

以下是我的代码到现在为止.

private void CreateSampleWordDocument()
    {
        //string sourceFile = Path.Combine("D:\\GeneralLetter.dot");
        //string destinationFile = Path.Combine("D:\\New.doc");
        string sourceFile = Path.Combine("D:\\GeneralWelcomeLetter.docx");
        string destinationFile = Path.Combine("D:\\New.docx");
        try
        {
            // Create a copy of the template file and open the copy
            File.Copy(sourceFile, destinationFile, true);
            using (WordprocessingDocument document = WordprocessingDocument.Open(destinationFile, true))
            {
                // Change the document type to Document
                document.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
                //Get the Main Part of the document
                MainDocumentPart mainPart = document.MainDocumentPart;
                mainPart.Document.Save();
            }
        }
        catch
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在如何查找某些文本并替换相同的文本?我无法通过链接,所以一些代码提示将是可观的.

templates openxml c#-4.0

14
推荐指数
4
解决办法
3万
查看次数