C# QR코드를 생성하여 Excel에 QR코드 이미지 넣기

13927 단어 Excel
  /// <summary>
        ///  excel 
        /// </summary>
        /// <param name="excelFilePath"> Excel</param>
        /// <param name="imageFilePath"> </param>
        /// <param name="width"> </param>
        /// <param name="height"> </param>
        /// <param name="col">Excel </param>
        /// <param name="row">Excel </param>
        public static void InsertImgToExcel(string excelFilePath, string imageFilePath,int width,int height,int col,int row)
        {
            try
            {
                FileStream fs = new FileStream(excelFilePath, FileMode.Open, FileAccess.ReadWrite);
                HSSFWorkbook hssfworkbook = new HSSFWorkbook(fs);
                ISheet sheet1 = hssfworkbook.GetSheetAt(0);

                //map the path to the img folder
                string imagesPath = imageFilePath;
                //create an image from the path
                System.Drawing.Image image = System.Drawing.Image.FromFile(imagesPath);
                MemoryStream ms = new MemoryStream();
                //pull the memory stream from the image (I need this for the byte array later)
                image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                //the drawing patriarch will hold the anchor and the master information
                IDrawing patriarch = sheet1.CreateDrawingPatriarch();
                //store the coordinates of which cell and where in the cell the image goes
                HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 100, 100, col, row, col+3, row+3);
                //types are 0, 2, and 3. 0 resizes within the cell, 2 doesn't
                anchor.AnchorType = 2;
                //add the byte array and encode it for the excel file
                int index = hssfworkbook.AddPicture(ms.ToArray(), PictureType.JPEG);
                IPicture pict = patriarch.CreatePicture(anchor, LoadImage(imagesPath, hssfworkbook));
                pict.Resize();// 

                FileStream fs3 = new FileStream(excelFilePath, FileMode.OpenOrCreate);
                hssfworkbook.Write(fs3);
                fs3.Close();
                fs.Close();
}

QR코드 생성
 /// <summary>
        ///  
        /// </summary>
        /// <param name="codeNumber"> </param>     
        /// <param name="size"> </param>
        /// <returns> </returns>
        public Bitmap Create_ImgCode(string codeNumber, int size)
        {
            // 
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            // 
            qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
            // 
            qrCodeEncoder.QRCodeScale = size;
            // 
            qrCodeEncoder.QRCodeVersion = 0;
            // 
            qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
            // 
            System.Drawing.Bitmap image = qrCodeEncoder.Encode(codeNumber);
            return image;
        }

위의 방법으로 QR코드를 생성하는 데 문제가 있는데 데이터의 양이 매우 많을 때 생성할 수 없다.뒤에 zxing을 바꿔서 QR코드를 만들었는데 데이터가 좀 많아요.
 1 public static Bitmap Create(string str)
 2         {
 3             EncodingOptions options = null;
 4             BarcodeWriter writer = null;
 5 
 6             options = new QrCodeEncodingOptions
 7             {
 8                 DisableECI = true,
 9                 CharacterSet = "UTF-8",
10                 Margin = 0,
11                 Width = 125,
12                 Height = 125
13             };
14             writer = new BarcodeWriter();
15             writer.Format = BarcodeFormat.QR_CODE;
16             writer.Options = options;
17             return writer.Write(str);
18         }

생성된 QR코드는 주위의 공백이 약간 많을 수 있다. 초보적인 테스트는 정보량이 너무 많기 때문에 QR코드가 원시 블록 간격에 따라 생성되면 고정된 크기를 초과할 수 있기 때문에 자동으로 블록 간격을 줄여서 생성된 것이 고정되지 않고 공백이 남는다
계기를 이용하여 한 장의 사진에 어떤 부분에 QR코드가 함유되어 있음을 스캔했다. 만약에 사진이 너무 크면 저는 3000*2400 정도의 크기를 만났기 때문에 QR코드로 해석하면 도저히 해석할 수 없다. QR코드의 위치에 따라 잘라서 재단한 후에 QR코드를 해석하면 실현할 수 있다.
  /// <summary>
        ///   --  GDI+ 
        /// </summary>
        /// <param name="b"> Bitmap</param>
        /// <returns> Bitmap</returns>
        public static Bitmap Cut(Bitmap b)
        {
            if (b == null)
            {
                return null;
            }
            int startX = b.Width * 3 / 4;
            int startY = 0;
            int width = b.Width / 4;
            int height = b.Height / 4;
            try
            {
                Bitmap bmpOut = new Bitmap(width, height, PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(bmpOut);
                g.DrawImage(b, new Rectangle(0, 0, width, height), new Rectangle(startX, startY, width, height), GraphicsUnit.Pixel);
                g.Dispose();
                return bmpOut;
            }
            catch
            {
                return null;
            }
        }

        /// <summary>
        ///   --  GDI+ 
        /// </summary>
        /// <param name="b"> Bitmap</param>
        /// <param name="StartX"> X</param>
        /// <param name="StartY"> Y</param>
        /// <param name="iWidth"> </param>
        /// <param name="iHeight"> </param>
        /// <returns> Bitmap</returns>
        public static Bitmap Cut(Bitmap b, int StartX, int StartY, int iWidth, int iHeight)
        {
            if (b == null)
            {
                return null;
            }
            int w = b.Width;
            int h = b.Height;
            if (StartX >= w || StartY >= h)
            {
                return null;
            }
            if (StartX + iWidth > w)
            {
                iWidth = w - StartX;
            }
            if (StartY + iHeight > h)
            {
                iHeight = h - StartY;
            }
            try
            {
                Bitmap bmpOut = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);
                Graphics g = Graphics.FromImage(bmpOut);
                g.DrawImage(b, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel);
                g.Dispose();
                return bmpOut;
            }
            catch
            {
                return null;
            }
        }

좋은 웹페이지 즐겨찾기