Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2017
490
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.07 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using DocumentFormat.OpenXml;
  5. using DocumentFormat.OpenXml.Packaging;
  6. using DocumentFormat.OpenXml.Spreadsheet;
  7. using Color = DocumentFormat.OpenXml.Spreadsheet.Color;
  8. using Font = DocumentFormat.OpenXml.Spreadsheet.Font;
  9.  
  10. namespace ImageToSpreadsheet
  11. {
  12.     internal static class Program
  13.     {
  14.         private static void Main(string[] args)
  15.         {
  16.             Console.WriteLine(DateTime.Now);
  17.  
  18.             var bmp = new Bitmap(args[0]);
  19.             bmp.RotateFlip(RotateFlipType.Rotate270FlipY);
  20.  
  21.             string xlsPath = args[0] + ".xlsx";
  22.             using (var document = SpreadsheetDocument.Create(xlsPath, SpreadsheetDocumentType.Workbook, true))
  23.             {
  24.                 var workbookPart = document.AddWorkbookPart();
  25.                 var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
  26.                 var book = new Workbook();
  27.                 worksheetPart.Worksheet = new Worksheet();
  28.  
  29.                 // Columns
  30.                 var columns = new Columns();
  31.                 for (int i = 0; i < bmp.Width; i++)
  32.                 {
  33.                     columns.AppendChild(new Column {Min = (uint) i + 1, Max = (uint) i + 1, Width = (1 - 12 + 5) / 7d + 1, CustomWidth = true});
  34.                 }
  35.                 worksheetPart.Worksheet.AppendChild(columns);
  36.  
  37.                 // Styles
  38.                 Dictionary<System.Drawing.Color, uint> colors;
  39.                 var stylesPart = workbookPart.AddNewPart<WorkbookStylesPart>();
  40.                 stylesPart.Stylesheet = GenerateStyleSheet(bmp, out colors);
  41.  
  42.                 // Bitmap
  43.                 var sheetData = worksheetPart.Worksheet.AppendChild(new SheetData());
  44.                 for (int i = 0; i < bmp.Height; i++)
  45.                 {
  46.                     var row = sheetData.AppendChild(new Row {Height = 1.0, CustomHeight = true});
  47.                     for (int j = 0; j < bmp.Width; j++)
  48.                     {
  49.                         var cell = new Cell {StyleIndex = colors[bmp.GetPixel(i, j)]};
  50.                         row.AppendChild(cell);
  51.                     }
  52.                 }
  53.  
  54.                 var sheets = book.AppendChild(new Sheets());
  55.                 var sheet = new Sheet
  56.                 {
  57.                     Name = "Лист1",
  58.                     SheetId = 1,
  59.                     Id = workbookPart.GetIdOfPart(worksheetPart)
  60.                 };
  61.                 sheets.AppendChild(sheet);
  62.  
  63.                 document.WorkbookPart.Workbook = book;
  64.                 document.WorkbookPart.Workbook.Save();
  65.  
  66.                 workbookPart.Workbook.Save();
  67.             }
  68.  
  69.             Console.WriteLine(DateTime.Now);
  70.             Console.Read();
  71.         }
  72.  
  73.         private static Stylesheet GenerateStyleSheet(Bitmap bmp, out Dictionary<System.Drawing.Color, uint> colors)
  74.         {
  75.             var fills = new Fills(
  76.                 new Fill(new PatternFill {PatternType = PatternValues.None}),
  77.                 new Fill(new PatternFill {PatternType = PatternValues.Gray125}));
  78.  
  79.             var cellFormats = new CellFormats(new CellFormat {FontId = 0, FillId = 0, BorderId = 0});
  80.  
  81.             var stylesheet = new Stylesheet(
  82.                 new Fonts(
  83.                     new Font(
  84.                         new FontSize {Val = 11},
  85.                         new Color {Rgb = new HexBinaryValue {Value = "000000"}},
  86.                         new FontName {Val = "Calibri"})
  87.  
  88.                     ),
  89.                 fills,
  90.                 new Borders(
  91.                     new Border(
  92.                         new LeftBorder() ,
  93.                         new RightBorder(),
  94.                         new TopBorder(),
  95.                         new BottomBorder(),
  96.                         new DiagonalBorder())
  97.                     ),
  98.                 cellFormats
  99.                 );
  100.            
  101.             colors = new Dictionary<System.Drawing.Color, uint>();
  102.             var hash = GetColorsSet(bmp);
  103.  
  104.             uint i = 1;
  105.             foreach (var t in hash)
  106.             {
  107.                 fills.AppendChild(
  108.                     new Fill(new PatternFill(new ForegroundColor {Rgb = new HexBinaryValue {Value = ToHex(t)}})
  109.                     {
  110.                         PatternType = PatternValues.Solid
  111.                     }));
  112.  
  113.                 cellFormats.AppendChild(new CellFormat {FontId = 0, FillId = i+1, BorderId = 0, ApplyFont = true});
  114.  
  115.                 colors[t] = i++;
  116.             }
  117.  
  118.             return stylesheet;
  119.         }
  120.  
  121.         private static string ToHex(System.Drawing.Color c)
  122.         {
  123.             return c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
  124.         }
  125.  
  126.         private static IEnumerable<System.Drawing.Color> GetColorsSet(Bitmap bmp)
  127.         {
  128.             var hash = new HashSet<System.Drawing.Color>();
  129.  
  130.             for (int i = 0; i < bmp.Width; i++)
  131.             {
  132.                 for (int j = 0; j < bmp.Height; j++)
  133.                 {
  134.                     hash.Add(bmp.GetPixel(i, j));
  135.                 }
  136.             }
  137.  
  138.             return hash;
  139.         }
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement