una texto numero mes ingles formato fecha extraer español convertir cambiar año automaticamente aaaa c# excel date types format

texto - ¿Cómo establecer un formato de fecha corta localizado para una celda en Excel con C#?



formato fecha excel (2)

Deberías poder hacerlo así:

Application xlApp = new Application(); Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); Worksheet ws = wb.Worksheets[1]; var yearCode = xlApp.International[XlApplicationInternational.xlYearCode]; var monthCode = xlApp.International[XlApplicationInternational.xlMonthCode]; var dayCode = xlApp.International[XlApplicationInternational.xlDayCode]; ws.Cells[1, 1].NumberFormat = string.Format("{0}{1}.{2}{3}.{4}{5}{6}{7}", dayCode, dayCode, monthCode, monthCode, yearCode, yearCode, yearCode, yearCode);

En la Application está la propiedad International . Puede consultarlo usando la enumeración XlApplicationInternational . Para mí xlYearCode devuelve é por ejemplo. Eso debería ser para ti.

Después de eso, puede construir su NumberFormat usando los códigos de formato previamente consultados.

Usando C # y VSTO, el tipo de una celda en Excel se puede configurar con el siguiente código:

worksheet.Cells[i, j].NumberFormat = magicString;

, donde la worksheet es un objeto de la clase Microsoft.Office.Interop.Excel.Worksheet , i es un número de fila de la celda, j es un número de columna de la celda, magicString es una cadena que define el tipo de la celda (nota: Excel llama a los tipos como formato , pero a continuación estoy usando el tipo de palabra).

Los siguientes magicString s definen los siguientes tipos de Excel:

  • string magicString = ""; - define el tipo de Excel "General";
  • string magicString = "@"; - define el tipo de Excel "Texto";
  • string magicString = "0%"; - define el tipo de Excel "Porcentual".

La situación es más complicada cuando me gustaría establecer el tipo de Excel "Fecha". La complejidad está relacionada con la localización del Excel y la localización del sistema de Windows.

Entonces, por ejemplo, tengo una versión rusa de Excel (en particular, todos los tipos están escritos en Excel en ruso) y mi sistema Windows tiene el siguiente formato de fecha corta: "dd.MM.aaaa" (uno puede encontrar esta configuración en el Panel de control> Región e idioma> Formatos). Tengo una versión en inglés de Windows, pero esto no juega ningún papel.

Como resultado, si voy a usar el siguiente magicString en mi código, el tipo de celda se establecerá en el tipo de fecha corta:

  • string magicString = "ДД.ММ.ГГГГ"; - define el tipo de Excel "Fecha" (o, más exactamente, "Fecha corta");

Como puede ver, aquí el magicString es una combinación de las letras rusas (en ruso, porque el Excel es ruso) y del formato establecido en la configuración de Windows.

Si, en lugar de este magicString , uso el magicString igual a "DD.MM.YYYY" (es decir, las letras en inglés), aparecen errores.

Por lo tanto, si quisiera que mi complemento de Excel pudiera establecer correctamente el tipo de "fecha corta" para todas las versiones de Excel (inglés, ruso, alemán y todas) y para todas las configuraciones de localización de Windows, tengo poder utilizar alguna magicString universal, que es independiente de dos factores mencionados.

Como opción, puedo leer el formato de fecha corta desde la configuración de Windows con este código:

string shortDatePattern = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;

y luego, reemplace las letras en la cadena shortDatePattern obtenida con aquellas que corresponden al lenguaje de Excel. Sin embargo, esta forma me parece demasiado complicada.

Mi pregunta es: ¿existe algún magicString universal que sea válido para todos los idiomas de Excel y para todas las configuraciones de localización de Windows, como ocurre con otros tipos de Excel como "General", "Texto" y "Porcentaje"? O, tal vez, ¿alguien conoce otra manera simple de alcanzar tal universalidad?


Muchas gracias a Szabolcs Dézsi por la pista. Pero solo resuelve una parte de mi pregunta. Otra parte es cómo extraer los códigos de formato de fecha de la configuración de localización del sistema de Windows. No he encontrado la respuesta en internet y proporciono mi propia solución, en combinación con la solución de Szabolcs Dézsi .

Antes que nada, creemos la siguiente clase:

using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using Excel = Microsoft.Office.Interop.Excel; namespace MyNamespace { internal sealed class DateFormatComponentCodes { private readonly char year; private readonly char month; private readonly char day; // Constructs the object based on the system localization. public DateFormatComponentCodes() { DateTimeFormatInfo dateTimeFormatInfo = CultureInfo.CurrentCulture.DateTimeFormat; var yearMonth = new HashSet<char>(new HashSet<char>(dateTimeFormatInfo.YearMonthPattern.ToCharArray()).Where(c => char.IsLetter(c))); var monthDay = new HashSet<char>(new HashSet<char>(dateTimeFormatInfo.MonthDayPattern.ToCharArray()).Where(c => char.IsLetter(c))); var monthHashSet = new HashSet<char>(yearMonth); monthHashSet.IntersectWith(monthDay); this.month = monthHashSet.First(); yearMonth.ExceptWith(monthHashSet); this.year = yearMonth.First(); monthDay.ExceptWith(monthHashSet); this.day = monthDay.First(); } // Constructs the object based on the Excel localization. public DateFormatComponentCodes(Excel.Application application) { this.year = application.International[Excel.XlApplicationInternational.xlYearCode].ToString()[0]; this.month = application.International[Excel.XlApplicationInternational.xlMonthCode].ToString()[0]; this.day = application.International[Excel.XlApplicationInternational.xlDayCode].ToString()[0]; } public char Year { get { return this.year; } } public char Month { get { return this.month; } } public char Day { get { return this.day; } } } }

Y ahora vamos a crear dos objetos de esta clase y usarlos para generar un patrón de formato de fecha corta (llamado arriba como "cadena mágica") para Excel:

private string ConstructExcelShortDatePattern() { var systemDateComponentCodes = new DateFormatComponentCodes(); var excelDateComponentCodes = new DateFormatComponentCodes(this.application); string systemShortDatePattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern; string excelShortDatePattern = systemShortDatePattern.Replace(systemDateComponentCodes.Year, excelDateComponentCodes.Year).Replace(systemDateComponentCodes.Month, excelDateComponentCodes.Month).Replace(systemDateComponentCodes.Day, excelDateComponentCodes.Day); return excelShortDatePattern; }

La cadena devuelta se puede usar para establecer el formato de fecha corta para todas las localizaciones de Windows y todas las localizaciones de Excel, como

worksheet.Cells[i, j].NumberFormat = ConstructExcelShortDatePattern();