C# ile Microsoft Office programlarına erişmek konusundaki ikinci yazımızda Excel üzerinde hangi işlemleri yapabileceğimizi inceleyeceğiz. Projemize Office bileşenini nasıl referans olarak ekleyeceğimizi ilk yazımızda1 bahsettiğimiz için bu yazımızda tekrar bahsetmeyeceğiz.Öncelikle C# ile Excel programını kullanırken, Microsoft.Office.Interop.Excel sınıfının bize sağladığı ve çok kullanacağımız birkaç nesneden bahsetmek istiyorum.
Workbook: Microsoft
Excel çalışma kitabını temsil eder.
Worksheet: Çalışma kitabı
içindeki çalışma sayfalarını temsil eder.
Range: Bir çalışma
sayfasında bir veya daha fazla hücrenin oluşturduğu alanı temsil eder.
Programda ilk yapmamız
gereken şey “using
Microsoft.Office.Interop.Excel” satırını eklemektir.
ApplicationClass
ExcelUyg = new
ApplicationClass();
Satırı ile yeni bir
excel uygulamsı çalıştırıyoruz, görev yöneticisini takip ederek de bu işlemi
görebilirsiniz. Çalıştırdığımız excel uygulamasını sonlandrımak için ise
ExcelUyg.Quit();
komutunu
kullanıyoruz.
C# ile excel proglamlamaya giriş
Excel programı üzerinde
yeni bir çalışma kitabı oluşturmak için aşağıdaki kod yeterli olacaktır.
object
Missing = Type.Missing;
ApplicationClass
ExcelUyg = new
ApplicationClass();
ExcelUyg.Visible
= true;
Workbook
calismaKitap = ExcelUyg.Workbooks.Add(Missing);
Açıtığımız çalışma
kitabını üzerinde işlem yapmak için, çalışma kitabındaki ilk çalışma sayfasını
kullanacağız. İlk çalışma sayfasına erişmek için kullanacağımız kod şu
şekilde
Worksheet
calismaSayfa = (Worksheet)calismaKitap.Worksheets[1];
Unutmayalım ki Office
nesneslerinin indexleyicileri 1 den başlar yani Worksheets[0] şeklinde
kullanırsak program hata üretecektir.Artık çalışma sayfası üzerinde değişiklik
yapmaya hazırız.
C# ile excele veri aktarma
Beklenenin aksine
Excel’e ait bir hücre(cell) sınıfı yoktur. Bu nedenle hücreleri object anahtar
kelimesini kullanarak tanımlayacağız.
object
Hucre_1 = calismaSayfa.Cells[1, 1];
object
Hucre_2 = calismaSayfa.Cells[1, 3];
Range
Alan = calismaSayfa.get_Range(Hucre_1, Hucre_2);
Alan.MergeCells
= true;
Alan.Value2
= "C# ile Excel";
Burada Hucre_1
değişekenine çalışma sayfasında 1. Satır ve 1. Sütundaki hücreyi (A1 hücresi),
ve Hucre_2 değişkenine de çalışma sayfasında 1. Satır ve 2. Sütundaki hücreyi
(C1 hücresi) atadık, ve A1 hücresinden C1 hücresine kadar olan alanı Bolge
değişkenine atadık. Bu alandaki hücreleri birleşitirdik ve “C# ile Excel”
metnini yazdık.
C# ile Excel hücrelerini
biçimlendirmek
Muhtemelen sadece
yazmak yetmeyecek, ayrıca yazdığımız metni biçimlendirmek isteyeceğiz. Excel’de
renk atamak için System.Drawing.Color kullanılmaz bunun yerine renk önce tam
sayıya dönüştürülmelidir. Bunun için rengi kırmızı tonu 65536, yeşil tonu 256
ile çarpılır ve mavi tonu ile toplanır. Bunun için basit bir fonksiyon
kullanabiliriz.
int
RengiSayiyaCevir(Color
color)
{
return
color.B*256*256 + color.G*256 + color.R;
}
Bir alan üzerinde
kullanabileceğimiz temel font özellikleri aşağıdaki gibidir. Burada dikkat etmemiz
gereken, Font.Bold, Font.Italic boolean değil de tamsayı olarak tanımlanmış
olması. 1 değerini true, 0 değerini false anlamında kullanabiliriz.
Alan.Font.Color
= RengiSayiyaCevir(Color.Red);
Alan.Font.Name
= "Courier New";
Alan.Font.Size
= 22f;
Alan.Font.Bold
= 1;
Alan.Font.Italic
= 1;
Alanın kenarlığını bir
seferde tanımlayabileceğimiz gibi, her kenar için farklı kenarlıkda
verebiliriz.
Alan.BorderAround(XlLineStyle.xlContinuous,
XlBorderWeight.xlThin,
XlColorIndex.xlColorIndexNone
, null);
Alan.Borders[XlBordersIndex.xlEdgeRight].LineStyle
= XlLineStyle.xlDouble;
Alan.Borders[XlBordersIndex.xlEdgeRight].Color
= RengiSayiyaCevir(Color.Blue);
Alan.Borders[XlBordersIndex.xlEdgeRight].Weight
= XlBorderWeight.xlMedium;
Alan içerisindeki metni
istediğmiz gibi hizalayabiliriz.
Alan.VerticalAlignment
= XlVAlign.xlVAlignCenter;
Alan.HorizontalAlignment
= XlHAlign.xlHAlignCenter;
C# ile DataGridView içindeki verileri
Excel’e taşımak
Bu işlem için yuklarıda
yazdığımız kodları kullanarak basit bir fonksiyon yazacağız.
void
ExceleAktar(Worksheet
sayfa, DataGridView
dgv)
{
for
(int
i = 0 ;i < dgv.Rows.Count; i++)
{
for
(int
j = 0; j < dgv.Columns.Count; j++)
{
object
Hucre = sayfa.Cells[i+1, j+1];
Range
Alan = sayfa.get_Range(Hucre, Hucre);
Alan.Value2
= dgv[j, i].Value;
}
}
}
Burada Excelde hücreler
için satır ve sütun sayısı birden başladığı için Hucre değişkenine atama
sırasında i+1 ve j+1 kullandık. Bu fonksiyonumuzu test ekmek için form üzerinde
bir DataGridView ekleyerek aşağıdaki kodu çalıştırıyoruz.
void
ExcelUygulamasi()
{
object
Missing = Type.Missing;
ApplicationClass
ExcelUyg = new
ApplicationClass();
ExcelUyg.Visible = true;
ExcelUyg.Visible = true;
Workbook
calismaKitap = ExcelUyg.Workbooks.Add(Missing);
Worksheet
calismaSayfa = (Worksheet)
calismaKitap.Worksheets[1];
DataGridViewDoldur();
ExceleAktar(calismaSayfa,
dataGridView1);
}
void
DataGridViewDoldur()
{
dataGridView1.Columns.Clear();
dataGridView1.Columns.Add("A",
"A");
dataGridView1.Columns.Add("B",
"B");
dataGridView1.Columns.Add("C",
"C");
dataGridView1.Columns.Add("D",
"D");
dataGridView1.Columns.Add("E",
"E");
dataGridView1.Columns.Add("F",
"F");
dataGridView1.Columns.Add("G",
"G");
Random
rnd = new
Random();
for
(int
i = 0; i < 8; i++)
dataGridView1.Rows.Add(rnd.Next(100),
rnd.Next(100), rnd.Next(100), rnd.Next(100), rnd.Next(100), rnd.Next(100),
rnd.Next(100));
}
Burada DataGridView
içerisine rasgele veriler ekleyip bunu excel dosyamıza gönderiyoruz. Bu
verileri daha sonra Excel’de formul yazmak ve grafik çizmek için kullanacağız.
Bu veriler için sütun bazında ortalama alan formülü yazalım.
C# ile Excel Formülleri ve Grafikleri
for (int i = 1; i < 8; i++)
{
object
Hucre_1 = calismaSayfa.Cells[1, i];
object
Hucre_2 = calismaSayfa.Cells[8, i];
object
Hucre = calismaSayfa.Cells[10, i];
Range
Alan = calismaSayfa.get_Range(Hucre, Hucre);
Range
rng = calismaSayfa.get_Range(Hucre_1, Hucre_2);
Alan.Formula
= ExcelUyg.WorksheetFunction.Average(rng, Missing, Missing, Missing, Missing,
Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing,
Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing,
Missing, Missing, Missing, Missing, Missing, Missing, Missing, Missing,
Missing);
}
ExcelUyg.WorksheetFunction
altındaki
fonksiyonların alacağı parametre sayısı sabittir, eğer bizim
ihtiyacımızdan fazlası mevcut ise bunları daha önce tanımladığımız
Missing değişkeni ile tamamlayabiliriz. Burada Alan ile tanımladığız hücreye,
rng ile tanımladığımız bölgedeki sayıların ortalamasını hesaplayan formül
ekledik. Şimdi aynı verileri kullanarak grakik çizelim.
_Chart
grafik1 = (Chart)calismaKitap.Charts.Add(Missing,
Missing, Missing, Missing);
object
Hucre_1 = calismaSayfa.Cells[1, 1];
object
Hucre_2 = calismaSayfa.Cells[1, 7];
Range
Alan = calismaSayfa.get_Range(Hucre_1, Hucre_2);
grafik1.SetSourceData(Alan,
XlRowCol.xlRows);grafik1.ChartType
= XlChartType.xlPie;
grafik1.Location(XlChartLocation.xlLocationAsObject,
calismaSayfa.Name);
Excel dosyalarını yazdırma
PrintDialog
printDialog = new
PrintDialog();
if
(printDialog.ShowDialog() == DialogResult.OK)
{
calismaSayfa.PrintOut(Missing,
Missing, printDialog.PrinterSettings.Copies, False,
printDialog.PrinterSettings.PrinterName,printDialog.PrinterSettings.PrintToFile,
printDialog.PrinterSettings.Collate,
printDialog.PrinterSettings.PrintFileName);
}
Excel dosyalarını kaydetme
object False = false;
object
True = true;
XlFileFormat
format = XlFileFormat.xlWorkbookDefault;
calismaKitap.SaveAs("C:\\yeni.xlsx",
format , Missing, Missing, Missing, False, XlSaveAsAccessMode.xlNoChange,
Missing, False, Missing, Missing, Missing );
Excel ile
yapabileceklerimiz çok daha fazla olsada şimdilik bunula yetineceğiz.
ılk colonda 00000000956 gibi değerler var atarken sıfırlar sılınıyor nasıl duzeltebılırm
YanıtlaSilEXCELL aKTAR KODUM BU
YanıtlaSilprivate void button2_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Application excelAktar = new Microsoft.Office.Interop.Excel.Application();
excelAktar.Visible = true;
Microsoft.Office.Interop.Excel.Workbook workbook = excelAktar.Workbooks.Add(System.Reflection.Missing.Value);
Microsoft.Office.Interop.Excel.Worksheet sheet1 = (Microsoft.Office.Interop.Excel.Worksheet)excelAktar.ActiveSheet;
sheet1.Cells.EntireColumn.Font.Size = 12;
int StartCol = 1;
int StartRow = 1;
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
Microsoft.Office.Interop.Excel.Range myRange = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[1, j + 1];
myRange.Value2 = dataGridView1.Columns[j].HeaderText;
}
StartRow++;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
for (int j = 0; j < dataGridView1.Columns.Count; j++)
{
try
{
Microsoft.Office.Interop.Excel.Range myRange = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[StartRow + i, StartCol + j];
myRange.Value2 = dataGridView1[j, i].Value == null ? "" : dataGridView1[j, i].Value.ToString();
}
catch
{
;
}
}
}
}
duzeldı
YanıtlaSilmyRange.NumberFormat = "@";
Günlerdir bulamadım. Elimizde olan excel dosyasının istediğimiz sayfada birkaç hücresinin verisini değiştirip kaydetmeyi. Yeni excel açmasını istemiyorum. buna örnek bir projesi olan varsa paylaşımını rica ederim.
YanıtlaSil"ken" bende aynı şeyi arıyorum ama bende bulamadım. Var olan bir excell dosyasında değişiklik yapmadan, yeni bir excel dosyası açmadan veri işlemek istiyorum ama bulamadım
YanıtlaSilBu yorum yazar tarafından silindi.
YanıtlaSil