Initial commit of the ClosedXML library
Establishes the foundational structure, core Excel functionality, and tooling. - Implements base components for cells, ranges, columns, and rows. - Integrates a custom calculation engine with a wide range of Excel functions. - Adds comprehensive support for styling, conditional formatting, data validation, comments, pictures, and charts. - Configures build setup, project metadata (NuGet), and developer guidelines. - Includes editor and Git attributes for consistent code style and line endings.
This commit is contained in:
@@ -0,0 +1,285 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using ClosedXML.Excel;
|
||||
using System.IO;
|
||||
using MoreLinq;
|
||||
|
||||
namespace ClosedXML_Examples
|
||||
{
|
||||
public class AddingComments : IXLExample
|
||||
{
|
||||
|
||||
public void Create(string filePath)
|
||||
{
|
||||
var wb = new XLWorkbook {Author = "Manuel"};
|
||||
AddMiscComments(wb);
|
||||
AddVisibilityComments(wb);
|
||||
AddPosition(wb);
|
||||
AddSignatures(wb);
|
||||
AddStyleAlignment(wb);
|
||||
AddColorsAndLines(wb);
|
||||
AddMagins(wb);
|
||||
AddProperties(wb);
|
||||
AddProtection(wb);
|
||||
AddSize(wb);
|
||||
AddWeb(wb);
|
||||
|
||||
wb.SaveAs(filePath);
|
||||
}
|
||||
|
||||
private void AddWeb(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Web");
|
||||
ws.Cell("A1").Comment.Style.Web.AlternateText = "The alternate text in case you need it.";
|
||||
}
|
||||
|
||||
private void AddSize(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Size");
|
||||
|
||||
// Automatic size is a copy of the property comment.Style.Alignment.AutomaticSize
|
||||
// I created the duplicate because it makes more sense for it to be in Size
|
||||
// but Excel has it under the Alignment tab.
|
||||
ws.Cell("A2").Comment.AddText("Things are very tight around here.");
|
||||
ws.Cell("A2").Comment.Style.Size.SetAutomaticSize();
|
||||
|
||||
ws.Cell("A4").Comment.AddText("Different size");
|
||||
ws.Cell("A4").Comment.Style
|
||||
.Size.SetHeight(30) // The height is set in the same units as row.Height
|
||||
.Size.SetWidth(30); // The width is set in the same units as row.Width
|
||||
|
||||
// Set all comments to visible
|
||||
ws.CellsUsed(XLCellsUsedOptions.All, c => c.HasComment).ForEach(c => c.Comment.SetVisible());
|
||||
}
|
||||
|
||||
private void AddProtection(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Protection");
|
||||
|
||||
ws.Cell("A1").Comment.Style
|
||||
.Protection.SetLocked(false)
|
||||
.Protection.SetLockText(false);
|
||||
}
|
||||
|
||||
private void AddProperties(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Properties");
|
||||
|
||||
ws.Cell("A1").Comment.Style.Properties.Positioning = XLDrawingAnchor.Absolute;
|
||||
ws.Cell("A2").Comment.Style.Properties.Positioning = XLDrawingAnchor.MoveAndSizeWithCells;
|
||||
ws.Cell("A3").Comment.Style.Properties.Positioning = XLDrawingAnchor.MoveWithCells;
|
||||
}
|
||||
|
||||
private void AddMagins(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Margins");
|
||||
|
||||
ws.Cell("A2").Comment
|
||||
.SetVisible()
|
||||
.AddText("Lorem ipsum dolor sit amet, adipiscing elit. ").AddNewLine()
|
||||
.AddText("Nunc elementum, sapien a ultrices, commodo nisl. ").AddNewLine()
|
||||
.AddText("Consequat erat lectus a nisi. Aliquam facilisis.");
|
||||
|
||||
ws.Cell("A2").Comment.Style
|
||||
.Margins.SetAll(0.25)
|
||||
.Size.SetAutomaticSize();
|
||||
}
|
||||
|
||||
private void AddColorsAndLines(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Colors and Lines");
|
||||
|
||||
ws.Cell("A2").Comment
|
||||
.AddText("Now ")
|
||||
.AddText("THIS").SetBold().SetFontColor(XLColor.Red)
|
||||
.AddText(" is colorful!");
|
||||
ws.Cell("A2").Comment.Style
|
||||
.ColorsAndLines.SetFillColor(XLColor.RichCarmine)
|
||||
.ColorsAndLines.SetFillTransparency(0.25) // 25% opaque
|
||||
.ColorsAndLines.SetLineColor(XLColor.Blue)
|
||||
.ColorsAndLines.SetLineTransparency(0.75) // 75% opaque
|
||||
.ColorsAndLines.SetLineDash(XLDashStyle.LongDash)
|
||||
.ColorsAndLines.SetLineStyle(XLLineStyle.ThickBetweenThin)
|
||||
.ColorsAndLines.SetLineWeight(7.5);
|
||||
|
||||
// Set all comments to visible
|
||||
ws.CellsUsed(XLCellsUsedOptions.All, c => c.HasComment).ForEach(c => c.Comment.SetVisible());
|
||||
}
|
||||
|
||||
private void AddStyleAlignment(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Alignment");
|
||||
|
||||
// Automagically adjust the size of the comment to fit the contents
|
||||
ws.Cell("A1").Comment.Style.Alignment.SetAutomaticSize();
|
||||
ws.Cell("A1").Comment.AddText("Things are pretty tight around here");
|
||||
|
||||
// Default values
|
||||
ws.Cell("A3").Comment
|
||||
.AddText("Default Alignments:").AddNewLine()
|
||||
.AddText("Vertical = Top").AddNewLine()
|
||||
.AddText("Horizontal = Left").AddNewLine()
|
||||
.AddText("Orientation = Left to Right");
|
||||
|
||||
// Let's change the alignments
|
||||
ws.Cell("A8").Comment
|
||||
.AddText("Vertical = Bottom").AddNewLine()
|
||||
.AddText("Horizontal = Right");
|
||||
ws.Cell("A8").Comment.Style
|
||||
.Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom)
|
||||
.Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Right);
|
||||
|
||||
// And now the orientation...
|
||||
ws.Cell("D3").Comment.AddText("Orientation = Bottom to Top");
|
||||
ws.Cell("D3").Comment.Style
|
||||
.Alignment.SetOrientation(XLDrawingTextOrientation.BottomToTop)
|
||||
.Alignment.SetAutomaticSize();
|
||||
|
||||
ws.Cell("E3").Comment.AddText("Orientation = Top to Bottom");
|
||||
ws.Cell("E3").Comment.Style
|
||||
.Alignment.SetOrientation(XLDrawingTextOrientation.TopToBottom)
|
||||
.Alignment.SetAutomaticSize();
|
||||
|
||||
ws.Cell("F3").Comment.AddText("Orientation = Vertical");
|
||||
ws.Cell("F3").Comment.Style
|
||||
.Alignment.SetOrientation(XLDrawingTextOrientation.Vertical)
|
||||
.Alignment.SetAutomaticSize();
|
||||
|
||||
|
||||
// Set all comments to visible
|
||||
ws.CellsUsed(XLCellsUsedOptions.All, c => c.HasComment).ForEach(c => c.Comment.SetVisible());
|
||||
}
|
||||
|
||||
private static void AddMiscComments(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Comments");
|
||||
|
||||
ws.Cell("A1").SetValue("Hidden").Comment.AddText("Hidden");
|
||||
ws.Cell("A2").SetValue("Visible").Comment.AddText("Visible");
|
||||
ws.Cell("A3").SetValue("On Top").Comment.AddText("On Top");
|
||||
ws.Cell("A4").SetValue("Underneath").Comment.AddText("Underneath");
|
||||
ws.Cell("A4").Comment.Style.Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom);
|
||||
ws.Cell("A3").Comment.SetZOrder(ws.Cell("A4").Comment.ZOrder + 1);
|
||||
|
||||
ws.Cell("D9").Comment.AddText("Vertical");
|
||||
ws.Cell("D9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.Vertical;
|
||||
ws.Cell("D9").Comment.Style.Size.SetAutomaticSize();
|
||||
|
||||
ws.Cell("E9").Comment.AddText("Top to Bottom");
|
||||
ws.Cell("E9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.TopToBottom;
|
||||
ws.Cell("E9").Comment.Style.Size.SetAutomaticSize();
|
||||
|
||||
ws.Cell("F9").Comment.AddText("Bottom to Top");
|
||||
ws.Cell("F9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.BottomToTop;
|
||||
ws.Cell("F9").Comment.Style.Size.SetAutomaticSize();
|
||||
|
||||
ws.Cell("E1").Comment.Position.SetColumn(5);
|
||||
ws.Cell("E1").Comment.AddText("Start on Col E, on top border");
|
||||
ws.Cell("E1").Comment.Style.Size.SetWidth(10);
|
||||
var cE3 = ws.Cell("E3").Comment;
|
||||
cE3.AddText("Size and position");
|
||||
cE3.Position.SetColumn(5).SetRow(4).SetColumnOffset(7).SetRowOffset(10);
|
||||
cE3.Style.Size.SetHeight(25).Size.SetWidth(10);
|
||||
var cE7 = ws.Cell("E7").Comment;
|
||||
cE7.Position.SetColumn(6).SetRow(7).SetColumnOffset(0).SetRowOffset(0);
|
||||
cE7.Style.Size.SetHeight(ws.Row(7).Height).Size.SetWidth(ws.Column(6).Width);
|
||||
|
||||
ws.Cell("G1").Comment.AddText("Automatic Size");
|
||||
ws.Cell("G1").Comment.Style.Alignment.SetAutomaticSize();
|
||||
var cG3 = ws.Cell("G3").Comment;
|
||||
cG3.SetAuthor("MDeLeon");
|
||||
cG3.AddSignature();
|
||||
cG3.AddText("This is a test of the emergency broadcast system.");
|
||||
cG3.AddNewLine();
|
||||
cG3.AddText("Do ");
|
||||
cG3.AddText("NOT").SetFontColor(XLColor.RadicalRed).SetUnderline().SetBold();
|
||||
cG3.AddText(" forget it.");
|
||||
cG3.Style
|
||||
.Size.SetWidth(25)
|
||||
.Size.SetHeight(100)
|
||||
.Alignment.SetDirection(XLDrawingTextDirection.LeftToRight)
|
||||
.Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Distributed)
|
||||
.Alignment.SetVertical(XLDrawingVerticalAlignment.Center)
|
||||
.Alignment.SetOrientation(XLDrawingTextOrientation.LeftToRight)
|
||||
.ColorsAndLines.SetFillColor(XLColor.Cyan)
|
||||
.ColorsAndLines.SetFillTransparency(0.25)
|
||||
.ColorsAndLines.SetLineColor(XLColor.DarkBlue)
|
||||
.ColorsAndLines.SetLineTransparency(0.75)
|
||||
.ColorsAndLines.SetLineDash(XLDashStyle.DashDot)
|
||||
.ColorsAndLines.SetLineStyle(XLLineStyle.ThinThick)
|
||||
.ColorsAndLines.SetLineWeight(5)
|
||||
.Margins.SetAll(0.25)
|
||||
.Properties.SetPositioning(XLDrawingAnchor.MoveAndSizeWithCells)
|
||||
.Protection.SetLocked(false)
|
||||
.Protection.SetLockText(false)
|
||||
.Web.SetAlternateText("This won't be released to the web");
|
||||
|
||||
ws.Cell("A9").Comment.SetAuthor("MDeLeon").AddSignature().AddText("Something");
|
||||
ws.Cell("A9").Comment.SetBold().SetFontColor(XLColor.DarkBlue);
|
||||
|
||||
ws.CellsUsed(XLCellsUsedOptions.All, c => !c.Address.ToStringRelative().Equals("A1") && c.HasComment).ForEach(c => c.Comment.SetVisible());
|
||||
}
|
||||
|
||||
private static void AddVisibilityComments(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Visibility");
|
||||
|
||||
// By default comments are hidden
|
||||
ws.Cell("A1").SetValue("I have a hidden comment").Comment.AddText("Hidden");
|
||||
|
||||
// Set the comment as visible
|
||||
ws.Cell("A2").Comment.SetVisible().AddText("Visible");
|
||||
|
||||
// The ZOrder on previous comments were 1 and 2 respectively
|
||||
// here we're explicit about the ZOrder
|
||||
ws.Cell("A3").Comment.SetZOrder(5).SetVisible().AddText("On Top");
|
||||
|
||||
// We want this comment to appear underneath the one for A3
|
||||
// so we set the ZOrder to something lower
|
||||
ws.Cell("A4").Comment.SetZOrder(4).SetVisible().AddText("Underneath");
|
||||
ws.Cell("A4").Comment.Style.Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom);
|
||||
|
||||
// Alternatively you could set all comments to visible with the following line:
|
||||
// ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible());
|
||||
|
||||
ws.Columns().AdjustToContents();
|
||||
}
|
||||
|
||||
private void AddPosition(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Position");
|
||||
|
||||
ws.Columns().Width = 10;
|
||||
|
||||
ws.Cell("A1").Comment.AddText("This is an unusual place for a comment...");
|
||||
ws.Cell("A1").Comment.Position
|
||||
.SetColumn(3) // Starting from the third column
|
||||
.SetColumnOffset(5) // The comment will start in the middle of the third column
|
||||
.SetRow(5) // Starting from the fifth row
|
||||
.SetRowOffset(7.5); // The comment will start in the middle of the fifth row
|
||||
|
||||
// Set all comments to visible
|
||||
ws.CellsUsed(XLCellsUsedOptions.All, c => c.HasComment).ForEach(c => c.Comment.SetVisible());
|
||||
}
|
||||
|
||||
private void AddSignatures(XLWorkbook wb)
|
||||
{
|
||||
var ws = wb.Worksheets.Add("Signatures");
|
||||
|
||||
// By default the signature will be with the logged user
|
||||
// ws.Cell("A2").Comment.AddSignature().AddText("Hello World!");
|
||||
|
||||
// You can override this by specifying the comment's author:
|
||||
ws.Cell("A2").Comment
|
||||
.SetAuthor("MDeLeon")
|
||||
.AddSignature()
|
||||
.AddText("Hello World!");
|
||||
|
||||
|
||||
// Set all comments to visible
|
||||
ws.CellsUsed(XLCellsUsedOptions.All, c => c.HasComment).ForEach(c => c.Comment.SetVisible());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using ClosedXML.Excel;
|
||||
using System.IO;
|
||||
|
||||
namespace ClosedXML_Examples
|
||||
{
|
||||
class EditingComments : IXLExample
|
||||
{
|
||||
|
||||
public void Create(string filePath) {
|
||||
|
||||
// Exercise(@"path/to/test/resources/comments");
|
||||
|
||||
}
|
||||
|
||||
public void Exercise(string basePath)
|
||||
{
|
||||
|
||||
// INCOMPLETE
|
||||
|
||||
var book = new XLWorkbook(Path.Combine(basePath, "EditingComments.xlsx"));
|
||||
var sheet = book.Worksheet(1);
|
||||
|
||||
// no change
|
||||
// A1
|
||||
|
||||
// edit existing comment
|
||||
sheet.Cell("B3").Comment.AddNewLine();
|
||||
sheet.Cell("B3").Comment.AddSignature();
|
||||
sheet.Cell("B3").Comment.AddText("more comment");
|
||||
|
||||
// delete
|
||||
//sheet.Cell("C1").DeleteComment();
|
||||
|
||||
// clear contents
|
||||
sheet.Cell("D3").Clear(XLClearOptions.Contents);
|
||||
|
||||
// new basic
|
||||
sheet.Cell("E1").Comment.AddText("non authored comment");
|
||||
|
||||
// new with author
|
||||
sheet.Cell("F3").Comment.AddSignature();
|
||||
sheet.Cell("F3").Comment.AddText("comment from author");
|
||||
|
||||
// TODO: merge with cells
|
||||
// TODO: resize with cells
|
||||
// TODO: visible
|
||||
|
||||
book.SaveAs(Path.Combine(basePath, "EditingComments_modified.xlsx"));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user