web-dev-qa-db-fra.com

Alignement de style de cellule sur une plage

J'ai un problème de formatage des cellules dans une feuille Excel. Pour une raison quelconque, mon code semble modifier le style de toutes les cellules lorsque je souhaite simplement modifier le style de quelques spécifiés ou d'une plage spécifiée.

Voici quelques-uns des codes que j'utilise:

app = new Microsoft.Office.Interop.Excel.Application();
workbook = app.Workbooks.Add(1);
worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[1];

//Change all cells' alignment to center
worksheet.Cells.Style.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;

//But then this line changes every cell style back to left alignment
worksheet.Cells[y + 1, x + 2].Style.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;

Pourquoi cela changerait-il le style de plusieurs cellules lorsque je le configurerai pour ne travailler que sur l'une d'entre elles? N'est-il pas censé fonctionner comme je le veux? Y a-t-il une autre façon de faire cela?

25
kschieck

D'après ce commentaire de l'OP, "j'ai trouvé le problème. Apparemment feuille-à-papier.Cells [y + 1, x + 1] .HorizontalAlignment", je pense que la véritable explication est que toutes les cellules partagent le même objet Style. Ainsi, si vous modifiez cet objet de style, toutes les cellules qui l'utilisent sont modifiées. Mais si vous modifiez directement la propriété d'alignement de la cellule, seule cette cellule est affectée.

21
DGH

Ça marche bien

worksheet.get_Range("A1","A14").Cells.HorizontalAlignment = 
                 Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;
19
Manikandan

Peut-être qu’en déclarant une plage, vous vous sentirez mieux. 

// fill in the starting and ending range programmatically this is just an example. 
string startRange = "A1";
string endRange = "A1";
Excel.Range currentRange = (Excel.Range)excelWorksheet.get_Range(startRange , endRange );
currentRange.Style.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;
6
crackhaus

La modification de styles directement dans la plage ou dans les cellules ne fonctionnait pas pour moi. Mais l'idée de:

  1. créer un style séparé
  2. appliquer toutes les valeurs de propriété de style nécessaires
  3. définissez le nom du style sur la propriété Style de la plage

, donné dans MSDN Comment: appliquer par programme des styles aux plages de classeurs a fait le travail. 

Par exemple:

var range = worksheet.Range[string.Format("A{0}:C{0}", rowIndex++)];
range.Merge();
range.Value = "some value";

var style = workbook.AddStyle();
style.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;

range.Style = style.Name;
1
horgh
  ExcelApp.Sheets[1].Range[ExcelApp.Sheets[1].Cells[1, 1], ExcelApp.Sheets[1].Cells[70, 15]].Cells.HorizontalAlignment =
                 Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;

Cela fonctionne bien pour moi.

Ne pas utiliser "Style:

worksheet.Cells[y,x].HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignLeft;
0
Sheep_Sleep

Quelque chose qui fonctionne pour moi. Prendre plaisir.

Excel.Application excelApplication =  new Excel.Application()  // start Excel and turn off msg boxes
{
     DisplayAlerts = false,
     Visible = false
};

Excel.Workbook workBook = excelApplication.Workbooks.Open(targetFile);
Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Worksheets[1];

var rDT = workSheet.Range(workSheet.Cells[monthYearNameRow, monthYearNameCol], workSheet.Cells[monthYearNameRow, maxTableColumnIndex]);
rDT.Merge();
rDT.Value = monthName + " " + year;
var reportDateRowStyle = workBook.Styles.Add("ReportDateRowStyle");
reportDateRowStyle.HorizontalAlignment = XlHAlign.xlHAlignCenter;
reportDateRowStyle.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);
reportDateRowStyle.Font.Bold = true;
reportDateRowStyle.Font.Size = 14;
rDT.Style = reportDateRowStyle;
0