FormatosArchivo.vb

  1. ' FormatosArchivo.vb — ProInf.net — feb-2012
  2. '
  3. ' Formatos de exportación de archivos: CSV, XML, HTML, etc.
  4.  
  5. Public Class ArchivoCSV 'Comma Separated Variable
  6. Inherits FormatoAbstracto
  7.  
  8. 'Importación:
  9. ' en LibreOffice 3.4 Calc >>> BIEN, mediante asistente automático
  10. ' en Microsoft Excel 2007 >>> ERROR, codificación incorrecta como ANSI (ISO-8859-1)
  11.  
  12. Public Overrides Sub EscribirTitulos(ByVal titulos As String())
  13. EscribirLinea(Join(titulos, ";"))
  14. End Sub
  15.  
  16. Public Overrides Sub EscribirValores(ByVal valores As String())
  17. EscribirLinea(Join(valores, ";"))
  18. End Sub
  19.  
  20. End Class
  21.  
  22. Public Class ArchivoTAB 'Tabuladores
  23. Inherits FormatoAbstracto
  24.  
  25. 'Importación:
  26. ' en LibreOffice 3.4 Calc >>> BIEN, haciendo en el archivo "Abrir con"
  27. ' en Microsoft Excel 2007 >>> BIEN, mediante asistente automático
  28.  
  29. Public Overrides Sub EscribirTitulos(ByVal titulos As String())
  30. EscribirLinea(Join(titulos, vbTab))
  31. End Sub
  32.  
  33. Public Overrides Sub EscribirValores(ByVal valores As String())
  34. EscribirLinea(Join(valores, vbTab))
  35. End Sub
  36.  
  37. End Class
  38.  
  39. Public Class ArchivoJSON 'JavaScript Object Notation
  40. Inherits FormatoAbstracto
  41.  
  42. 'Importación:
  43. ' para lenguajes JavaScript y otros
  44. 'http://www.json.org/json-es.html
  45.  
  46. Private _titulos As String()
  47. Private _campos As ICampo()
  48.  
  49. Protected Overrides Sub InicioDocumento()
  50. EscribirLinea(String.Format("var {0} = [", ObtenerNombreTabla))
  51. End Sub
  52.  
  53. Protected Overrides Sub FinDocumento()
  54. EscribirLinea("];")
  55. End Sub
  56.  
  57. Public Overrides Sub EscribirMetadatos(ByVal campos() As ICampo)
  58. _campos = campos
  59. End Sub
  60.  
  61. Public Overrides Sub EscribirTitulos(ByVal titulos As String())
  62. _titulos = titulos
  63. End Sub
  64.  
  65. Public Overrides Sub EscribirValores(ByVal valores As String())
  66. Escribir("{")
  67. For i = 0 To valores.Length - 1
  68. Dim titulo = Entrecomillar(_titulos(i))
  69. Dim valor = valores(i)
  70. If RequiereComillas(_campos(i)) Then
  71. valor = Entrecomillar(CodificarEscape(valor))
  72. End If
  73. Escribir(String.Format("{0}: {1}", titulo, valor))
  74. If i < valores.Length - 1 Then Escribir(", ")
  75. Next
  76. EscribirLinea("},")
  77. End Sub
  78.  
  79. '--------------------------------------------
  80. ' AUXILIAR
  81.  
  82. Shared Function Entrecomillar(ByVal texto As String) As String
  83. Return """" & texto & """"
  84. End Function
  85.  
  86. Shared Function CodificarEscape(ByVal texto As String) As String
  87. Return texto.Replace("\", "\\").Replace("""", "\""")
  88. End Function
  89.  
  90. Shared Function RequiereComillas(ByVal campo As ICampo) As Boolean
  91. Return campo.Tipo = TipoCampo.Texto Or
  92. campo.Tipo = TipoCampo.Fecha Or
  93. campo.Tipo = TipoCampo.Hora
  94. End Function
  95.  
  96. End Class
  97.  
  98. Public Class ArchivoXML 'Extensible Markup Language
  99. Inherits FormatoAbstracto
  100.  
  101. 'Importación:
  102. ' en LibreOffice 3.4 Calc >>> ERROR, de entrada y salida
  103. ' en Microsoft Excel 2007 >>> BIEN, lo convierte en tabla
  104.  
  105. Private _titulos As String()
  106.  
  107. Protected Overrides Sub InicioDocumento()
  108. EscribirLinea("<?xml version=""1.0""?>")
  109. EscribirLinea(String.Format("<{0}>", ObtenerNombreTabla()))
  110. End Sub
  111.  
  112. Protected Overrides Sub FinDocumento()
  113. EscribirLinea(String.Format("</{0}>", ObtenerNombreTabla()))
  114. End Sub
  115.  
  116. Public Overrides Sub EscribirTitulos(ByVal titulos As String())
  117. _titulos = titulos
  118. End Sub
  119.  
  120. Public Overrides Sub EscribirValores(ByVal valores As String())
  121. Escribir("<fila>")
  122. For i = 0 To valores.Length - 1
  123. Dim valor = Utilidades.CodificarHTML(valores(i))
  124. Escribir(String.Format("<{1}>{0}</{1}>", valor, _titulos(i)))
  125. Next
  126. EscribirLinea("</fila>")
  127. End Sub
  128. End Class
  129.  
  130. Public Class ArchivoHTML 'Página web
  131. Inherits FormatoAbstracto
  132.  
  133. 'Importación:
  134. ' en LibreOffice 3.4 Calc >>> BIEN, haciendo en el archivo "Abrir con"
  135. ' en Microsoft Excel 2007 >>> BIEN, formatea los títulos
  136.  
  137. Protected Overrides Sub InicioDocumento()
  138. 'Dim titulo = System.IO.Path.GetFileNameWithoutExtension(Ruta)
  139. EscribirLinea("<html>")
  140. EscribirLinea("<head>")
  141. EscribirLinea("<meta http-equiv=""Content-Type"" content=""text/html; charset=utf-8"" />")
  142. EscribirLinea(String.Format("<title>{0}</title>", ObtenerNombreTabla()))
  143. EscribirLinea("</head>")
  144. EscribirLinea("<body>")
  145. EscribirLinea(Space(1) & "<table border=1>")
  146. End Sub
  147.  
  148. Protected Overrides Sub FinDocumento()
  149. EscribirLinea(Space(2) & "</tbody>")
  150. EscribirLinea(Space(1) & "</table>")
  151. EscribirLinea("</body>")
  152. EscribirLinea("</html>")
  153. End Sub
  154.  
  155. Public Overrides Sub EscribirTitulos(ByVal titulos As String())
  156. EscribirLinea(Space(2) & "<thead>")
  157. Escribir(Space(3) & "<tr>")
  158. For Each titulo In titulos
  159. Escribir(String.Format("<th>{0}</th>", Utilidades.CodificarHTML(titulo)))
  160. Next
  161. EscribirLinea("</tr>")
  162. EscribirLinea(Space(2) & "</thead>")
  163. EscribirLinea(Space(2) & "<tbody>")
  164. End Sub
  165.  
  166. Public Overrides Sub EscribirValores(ByVal valores As String())
  167. Escribir(Space(3) & "<tr>")
  168. For Each valor In valores
  169. Escribir(String.Format("<td>{0}</td>", Utilidades.CodificarHTML(valor)))
  170. Next
  171. EscribirLinea("</tr>")
  172. End Sub
  173.  
  174. End Class
  175.  
  176. Public Class ArchivoSQL 'Base de datos
  177. Inherits FormatoAbstracto
  178.  
  179. 'Importación:
  180. ' en MySQL >>> BIEN
  181.  
  182. Private _campos As ICampo()
  183. Private _tabla As String
  184.  
  185. '--------------------------------------------
  186. ' INTERFAZ
  187.  
  188. Public Overrides Sub EscribirMetadatos(ByVal campos As ICampo())
  189. _campos = campos
  190. _tabla = ObtenerNombreTabla()
  191. EscribirLinea(String.Format("CREATE TABLE {0} (", _tabla))
  192. For i = 0 To campos.Length - 1
  193. Dim nombre = Utilidades.SimplificarNombre(campos(i).Nombre)
  194. Dim tipo = Recursos.camposSQL.ObtenerTipo(campos(i))
  195. Escribir(String.Format(" {0} {1}", nombre, tipo))
  196. If i < campos.Length - 1 Then Escribir(",")
  197. EscribirLinea()
  198. Next
  199. EscribirLinea(");")
  200. EscribirLinea()
  201. End Sub
  202.  
  203. Public Overrides Sub EscribirValores(ByVal valores As String())
  204. Escribir(String.Format("INSERT INTO {0} VALUES (", _tabla))
  205. For i = 0 To valores.Length - 1
  206. If i > 0 Then Escribir(", ")
  207. If RequiereComillas(_campos(i)) Then
  208. Escribir(Entrecomillar(DuplicarComillas(valores(i))))
  209. Else
  210. Escribir(valores(i))
  211. End If
  212. Next
  213. EscribirLinea(");")
  214. End Sub
  215.  
  216. '--------------------------------------------
  217. ' AUXILIAR
  218.  
  219. Shared Function Entrecomillar(ByVal texto As String) As String
  220. Return "'" & texto & "'"
  221. End Function
  222.  
  223. Shared Function DuplicarComillas(ByVal texto As String) As String
  224. Return texto.Replace("'", "''")
  225. End Function
  226.  
  227. Shared Function RequiereComillas(ByVal campo As ICampo) As Boolean
  228. Return campo.Tipo = TipoCampo.Texto Or
  229. campo.Tipo = TipoCampo.Fecha Or
  230. campo.Tipo = TipoCampo.Hora
  231. End Function
  232.  
  233. End Class
  234.  
  235. Public Class ArchivoXLS 'Hoja de cálculo MS-Excel
  236. Inherits FormatoAbstracto
  237.  
  238. 'Importación:
  239. ' en LibreOffice 3.4 Calc >>> BIEN, aunque toma la fecha como texto
  240. ' en Microsoft Excel 2007 >>> BIEN
  241.  
  242. Const CODIFICACION = "UTF-8" 'Codificaciones posibles: "ISO-8859-1", "UTF-8"
  243.  
  244. Private _campos As ICampo()
  245.  
  246. '--------------------------------------------
  247. ' INTERFAZ
  248.  
  249. Protected Overrides Sub InicioDocumento()
  250. EscribirLinea(String.Format("<?xml version=""1.0"" encoding=""{0}""?>", CODIFICACION))
  251. EscribirLinea("<Workbook ")
  252. EscribirLinea(" xmlns=""urn:schemas-microsoft-com:office:spreadsheet"" ")
  253. EscribirLinea(" xmlns:x=""urn:schemas-microsoft-com:office:excel"" ")
  254. EscribirLinea(" xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"" ")
  255. EscribirLinea(" xmlns:html=""http://www.w3.org/TR/REC-html40"">")
  256. EscribirLinea("<Styles>")
  257. EscribirLinea(" <Style ss:ID=""Default"" ss:Name=""Normal"">")
  258. EscribirLinea(" <Alignment ss:Vertical=""Top"" ss:WrapText=""1"" />")
  259. EscribirLinea(" </Style>")
  260. EscribirLinea("</Styles>")
  261. EscribirLinea(String.Format("<Worksheet ss:Name=""{0}"">", ObtenerNombreTabla()))
  262. EscribirLinea("<Table>")
  263. End Sub
  264.  
  265. Protected Overrides Sub FinDocumento()
  266. EscribirLinea("</Table>")
  267. EscribirLinea("</Worksheet>")
  268. EscribirLinea("</Workbook>")
  269. End Sub
  270.  
  271. Public Overrides Sub EscribirMetadatos(ByVal campos As ICampo())
  272. _campos = campos
  273. End Sub
  274.  
  275. Public Overrides Sub EscribirTitulos(ByVal titulos As String())
  276. EscribirLinea("<Row>")
  277. For Each titulo In titulos
  278. EscribirLinea(String.Format("<Cell><Data ss:Type=""String"">{0}</Data></Cell>", titulo))
  279. Next
  280. EscribirLinea("</Row>")
  281. End Sub
  282.  
  283. Public Overrides Sub EscribirValores(ByVal valores As String())
  284. EscribirLinea("<Row>")
  285. For i = 0 To valores.Length - 1
  286. Dim tipo = _campos(i).Tipo
  287. Dim valor = Utilidades.CodificarHTML(Normalizar(valores(i), tipo))
  288. EscribirLinea(String.Format("<Cell><Data ss:Type=""{1}"">{0}</Data></Cell>", valor, ObtenerTipoCelda(tipo)))
  289. Next
  290. EscribirLinea("</Row>")
  291. End Sub
  292.  
  293. '--------------------------------------------
  294. ' AUXILIAR
  295.  
  296. Shared Function Normalizar(ByVal valor As String, ByVal tipo As TipoCampo) As String
  297. Select Case tipo
  298. Case TipoCampo.Fecha : Return NormalizarFecha(valor)
  299. Case Else : Return valor
  300. End Select
  301. End Function
  302.  
  303. Shared Function NormalizarFecha(ByVal fechaSQL As String) As String
  304. Dim fecha = Date.Parse(fechaSQL)
  305. Return String.Format("{0}/{1}/{2}", fecha.Day, fecha.Month, fecha.Year)
  306. End Function
  307.  
  308. Shared Function ObtenerTipoCelda(ByVal tipo As TipoCampo) As String
  309. If tipo = TipoCampo.Texto Or
  310. tipo = TipoCampo.Fecha Or
  311. tipo = TipoCampo.Hora Then
  312. Return "String"
  313. Else
  314. Return "Number"
  315. End If
  316. End Function
  317.  
  318. End Class
  319.  
  320. Public Class ArchivoPRN 'Alineado con espacios en blanco para imprimir
  321. Inherits FormatoAbstracto
  322.  
  323. 'Importación:
  324. ' en LibreOffice 3.4 Calc > BIEN, haciendo en el archivo "Abrir con"
  325. ' en Microsoft Excel 2007 > BIEN, mediante asistente
  326.  
  327. Private _campos As ICampo()
  328. Private Shared _diccio As New DiccionarioTiposCampos()
  329.  
  330. Public Overrides Sub EscribirMetadatos(ByVal campos As ICampo())
  331. _campos = campos
  332. End Sub
  333.  
  334. Public Overrides Sub EscribirTitulos(ByVal titulos As String())
  335. EscribirDatos(titulos)
  336. End Sub
  337.  
  338. Public Overrides Sub EscribirValores(ByVal valores As String())
  339. EscribirDatos(valores)
  340. End Sub
  341.  
  342. '--------------------------------------------
  343. ' AUXILIAR
  344.  
  345. Private Sub EscribirDatos(ByVal textos As String())
  346. For i = 0 To textos.Length - 1
  347. Dim texto = _diccio.Recortar(textos(i), _campos(i))
  348. Escribir(texto)
  349. Next
  350. EscribirLinea()
  351. End Sub
  352.  
  353. Private Class DiccionarioTiposCampos
  354. Inherits Dictionary(Of TipoCampo, Estructura)
  355. Sub New()
  356. Add(TipoCampo.Texto, New Estructura(25, Alineacion.Izquierda))
  357. Add(TipoCampo.Entero, New Estructura(10, Alineacion.Derecha))
  358. Add(TipoCampo.Numero, New Estructura(15, Alineacion.Derecha))
  359. Add(TipoCampo.Logico, New Estructura(5, Alineacion.Izquierda))
  360. Add(TipoCampo.Fecha, New Estructura(10, Alineacion.Izquierda))
  361. Add(TipoCampo.Hora, New Estructura(8, Alineacion.Izquierda))
  362. End Sub
  363. Function Recortar(ByVal texto As String, ByVal campo As ICampo) As String
  364. Dim tipo = Me(campo.Tipo)
  365. Dim salida As String = ""
  366. Dim espacios = Math.Max(0, tipo.Largo - texto.Length)
  367. Select Case tipo.Alineacion
  368. Case Alineacion.Izquierda : salida = texto & Space(espacios)
  369. Case Alineacion.Derecha : salida = Space(espacios) & texto
  370. End Select
  371. Return salida.Substring(0, tipo.Largo)
  372. End Function
  373. End Class
  374.  
  375. Private Structure Estructura
  376. Dim Largo As String
  377. Dim Alineacion As Alineacion
  378. Sub New(ByVal largo As Integer, ByVal alineacion As Alineacion)
  379. Me.Largo = largo
  380. Me.Alineacion = alineacion
  381. End Sub
  382. End Structure
  383.  
  384. Private Enum Alineacion
  385. Izquierda
  386. Derecha
  387. End Enum
  388.  
  389. End Class
  390.  

Proinf.net