VisualBasic Windows Web ASP.NET (.NET Framework) projekti: AlkoGetPricesNET
Toteutettu Visual Studio 2019 Community ympäristössä (.NET Framework 4.5)
Empty, Web Forms, Not Configured for HTTPS
Lisää projektiin uusi Web Form (Default.aspx)
Poista Global.asax -tiedosto sekä App_Data ja Models -kansiot
Design: Web Formille paneeli (Panel1) ja sen sisään gridview (GridView1).
Default.aspx.vb:
Imports System
Imports System.IO
Imports System.Data
Imports System.Drawing
Imports OfficeOpenXml 'referenssi EPPlus.dll
Imports System.Net
Imports System.Globalization
Imports System.Threading
Public Class _Default
Inherits System.Web.UI.Page
Public Shared slen As Long
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
Dim ds As DataSet = New DataSet
ds.ReadXml(Server.MapPath("visitors.xml"))
Dim hits As Integer = Int32.Parse(ds.Tables(0).Rows(0)("hits").ToString())
hits += 1
ds.Tables(0).Rows(0)("hits") = hits.ToString()
ds.WriteXml(Server.MapPath("visitors.xml"))
ds.Tables.Clear()
ds = Nothing
Dim fi As CultureInfo = New CultureInfo("fi-FI")
Thread.CurrentThread.CurrentCulture = fi
Dim URL As String = "https://www.alko.fi/INTERSHOP/static/WFS/Alko-OnlineShop-Site/-/Alko-OnlineShop/fi_FI/Alkon%20Hinnasto%20Tekstitiedostona/alkon-hinnasto-tekstitiedostona.xlsx"
Dim package As New ExcelPackage()
Dim mystream As Stream = GetTheShit(URL)
Dim bytes() As Byte
Using reader As BinaryReader = New BinaryReader(mystream)
bytes = reader.ReadBytes(slen)
End Using
Dim memstream As New MemoryStream
memstream.Write(bytes, 0, bytes.Length - 1)
package.Load(memstream)
Dim sheet As ExcelWorksheet = package.Workbook.Worksheets(1)
Dim dt As New DataTable
Dim headers As String = String.Empty
For i As Integer = 4 To 4
For j As Integer = 1 To 10
Dim col As New DataColumn
Select Case j
Case 1 To 6
col.ColumnName = "Col" & j.ToString
col.DataType = Type.GetType("System.String")
col.Caption = sheet.Cells(i, j).Text
headers += col.Caption & ","
dt.Columns.Add(col)
Case 9, 10
col.ColumnName = "Col" & (j - 2).ToString
col.DataType = Type.GetType("System.String")
col.Caption = sheet.Cells(i, j).Text
headers += col.Caption & ","
dt.Columns.Add(col)
End Select
col.Dispose()
Next j
Next i
headers = headers.Substring(0, headers.Length - 1)
Dim harray() As String = headers.Split(",")
headers = String.Empty
For i As Integer = 5 To sheet.Dimension.End.Row
Dim dr As DataRow = dt.NewRow
For j As Integer = 1 To 10
Select Case j
Case 1 To 4
dr("Col" & j.ToString) = Replace(sheet.Cells(i, j).Text, " ", " ") 'välilyönnin tilalle Alt + 255
Case 5 To 6
dr("Col" & j.ToString) = CType(Val(sheet.Cells(i, j).Text), Decimal).ToString("C")
Case 9, 10
dr("Col" & (j - 2).ToString) = Replace(sheet.Cells(i, j).Text, " ", " ") 'välilyönnin tilalle Alt + 255
End Select
Next j
dt.Rows.Add(dr)
Next i
For i As Integer = 0 To dt.Columns.Count - 1
dt.Columns(i).ColumnName = harray(i)
Next
Erase harray
GridView1.AlternatingRowStyle.BackColor = Color.AliceBlue
GridView1.DataSource = dt
GridView1.DataBind()
sheet.Dispose()
package.Dispose()
End If
End Sub
Public Function GetTheShit(strURL As String) As Stream
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
Dim Req As HttpWebRequest = CType(WebRequest.Create(strURL), HttpWebRequest)
Req.ContentType = "application/octet-stream"
Req.Method = "GET"
Req.KeepAlive = False
Dim Resp As HttpWebResponse = CType(Req.GetResponse(), HttpWebResponse)
If (Resp.StatusCode = HttpStatusCode.OK) Then
slen = Resp.ContentLength
Return CType(Resp.GetResponseStream, System.IO.Stream)
Resp.Close() : Resp.Dispose() : Req = Nothing
Exit Function
End If
Resp.Dispose()
Return Nothing
End Function
End ClassDefaul.aspx:
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="AlkoGetPricesNET._Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="x-ua-compatible" content="ie=edge, chrome=1" />
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" href="mystyle.css"/>
<link rel="shortcut icon" href="favicon.ico"/>
</head>
<body>
<form id="form1" runat="server">
<asp:Panel ID="Panel1" runat="server" CssClass="pnl1" ScrollBars="Both">
<asp:GridView ID="GridView1" runat="server" Font-Size="Smaller" Height="16px" Width="1100px" CssClass="dgv1">
<HeaderStyle CssClass="gdvhdr" />
</asp:GridView>
</asp:Panel>
</form>
</body>
</html>mystyle.css:
.pnl1 {height: 512px; width: 1120px; scroll-behavior: smooth;}
.gdvhdr {background-color: black; color: white; top: 0px; left: 0px; width: 100%; position: relative;}visitors.xml (serverillä: read/write):
<?xml version="1.0" standalone="yes"?>
<counter>
<count>
<hits>0</hits>
</count>
</counter>Web.config: Visual Studio generoi automaattisesti (älä tee muutoksia).
Web.Config ulkoisella palvelimella:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<compilation debug="true" />
</system.web>
<system.webServer>
<httpErrors errorMode="Detailed" />
</system.webServer>
</configuration>EPPlus projektin voi ladata github:sta
HUOM esim. SmarterASP.NET 60 days Trial ASP.NET hosting -palvelussa sivuston juureen (= site root) pitää luoda bin -hakemisto ja .dll -tiedostot pitää ladata sinne.
(ei koske esim. myASP.NET 60 days Trial ASP.NET hosting -palvelua)
VB.NET Windows Forms Desktop App (.NET Framevork 4.5) projekti: AlkoGetPrices
(mukaan liitetty simppeli haku systeemi)
'Form1 ohjausobjektit:
'1 DataGridView (DataGridView1)
'1 ComboBox (ComboBox1)
'1 GroupBox (GroupBox1, Text: Anna hakusana)
'GroupBoxin sisälle: TextBox (TextBox1) ja Button (Button1, Text: Etsi)
'1 Button (Button2, Text: Palaa listaan)
Imports System.IO
Imports MSXML2 'Com referessi MicrosoftXML v6.0
Imports OfficeOpenXml 'referessi EPPlus.dll
Imports System.Data
Public Class Form1
Public Shared dt As DataTable = Nothing
Public Shared tempdt As DataTable = Nothing
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
GroupBox1.Visible = False
Button2.Visible = False
ComboBox1.Visible = False
DataGridView1.ScrollBars = ScrollBars.Both
Dim URL As String = "https://www.alko.fi/INTERSHOP/static/WFS/Alko-OnlineShop-Site/-/Alko-OnlineShop/fi_FI/Alkon%20Hinnasto%20Tekstitiedostona/alkon-hinnasto-tekstitiedostona.xlsx"
Dim oHTTP As ServerXMLHTTP60 = New ServerXMLHTTP60
oHTTP.open("GET", URL, False)
oHTTP.setRequestHeader("Content-Type", "application/octet-stream")
oHTTP.send()
Dim bytes() As Byte = CType(oHTTP.responseBody, Byte())
Dim oStream As New MemoryStream
oStream.Write(bytes, bytes.GetLowerBound(0), bytes.GetUpperBound(0))
Dim package As New ExcelPackage()
package.Load(oStream)
oStream.Close()
oStream = Nothing
oHTTP = Nothing
dt = New DataTable
Dim sheet As ExcelWorksheet = package.Workbook.Worksheets(1)
ComboBox1.Items.Add("- ETSI -")
For i As Integer = 4 To 4
For j As Integer = 1 To 10
Dim col As New DataColumn
Select Case j
Case 1 To 6
col.ColumnName = "Col" & j.ToString
col.DataType = Type.GetType("System.String")
col.Caption = sheet.Cells(i, j).Text
If j = 2 Or j = 3 Then
ComboBox1.Items.Add(col.Caption)
End If
dt.Columns.Add(col)
Case 9, 10
col.ColumnName = "Col" & (j - 2).ToString
col.DataType = Type.GetType("System.String")
col.Caption = sheet.Cells(i, j).Text
If j = 9 Then
ComboBox1.Items.Add(col.Caption)
End If
dt.Columns.Add(col)
End Select
col = Nothing
Next j
Next i
ComboBox1.SelectedIndex = 0
For i As Integer = 5 To sheet.Dimension.End.Row
Dim dr As DataRow = dt.NewRow
For j As Integer = 1 To 10
Select Case j
Case 1 To 4
dr("Col" & j.ToString) = sheet.Cells(i, j).Text
Case 5 To 6
dr("Col" & j.ToString) = CType(Val(sheet.Cells(i, j).Text), Decimal).ToString("C")
Case 9, 10
dr("Col" & (j - 2).ToString) = sheet.Cells(i, j).Text
End Select
Next j
dt.Rows.Add(dr)
dr = Nothing
Next i
sheet.Dispose() : sheet = Nothing
package.Dispose() : package = Nothing
DataGridView1.RowHeadersVisible = False
DataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
DataGridView1.DataSource = dt
DgvInit(DataGridView1, dt)
ComboBox1.Visible = True
End Sub
Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
If ComboBox1.SelectedIndex > 0 Then
GroupBox1.Visible = True
Else
TextBox1.Clear()
GroupBox1.Visible = False
End If
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If TextBox1.Text <> "" And ComboBox1.SelectedIndex > 0 Then
If tempdt IsNot Nothing Then
tempdt.Clear()
Else
tempdt = New DataTable
End If
For i As Integer = 0 To dt.Columns.Count - 1
Dim col As New DataColumn
col.ColumnName = "Col" & i.ToString
col.DataType = Type.GetType("System.String")
col.Caption = dt.Columns(i).Caption
tempdt.Columns.Add(col)
Next
For i As Integer = 0 To dt.Rows.Count - 1
For j As Integer = 0 To dt.Columns.Count - 1
If dt.Columns(j).Caption = ComboBox1.SelectedItem Then
If dt.Rows(i)(j) = TextBox1.Text Then
Dim temprow As DataRow = tempdt.NewRow
For k As Integer = 0 To dt.Columns.Count - 1
temprow("Col" & k.ToString) = dt.Rows(i)(k)
Next k
tempdt.Rows.Add(temprow)
End If
End If
Next j
Next i
End If
DataGridView1.DataSource = tempdt
DgvInit(DataGridView1, tempdt)
ComboBox1.SelectedIndex = 0
ComboBox1.Visible = False
Button2.Visible = True
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
DataGridView1.DataSource = dt
DgvInit(DataGridView1, dt)
tempdt.Clear()
tempdt = Nothing
ComboBox1.Visible = True
GroupBox1.Visible = True
Button2.Visible = False
End Sub
Public Sub DgvInit(ByVal ctlr As DataGridView, ByVal dtbl As DataTable)
For i As Integer = 0 To ctlr.Columns.Count - 1
ctlr.Columns(i).HeaderText = dtbl.Columns(i).Caption
ctlr.Columns(i).SortMode = DataGridViewColumnSortMode.NotSortable
ctlr.Columns(i).ReadOnly = True
Next
End Sub
End ClassEPPlus projektin voi ladata myös CodePlex arkistosta vielä tämän kuun loppuun asti.
Mille pimeälle keskiajalle Alkon sivusto on jämähtänyt kun hinnasto on tarjolla vaan Excel tiedostona?
AlkoGetPrices desktop executable & sorsat Tarjolla vain Putkassa...Putkasta Alkoon 😊 Alkosta Putkaan 😒
Nyt on nähty Alkon katalogista jo niin monta versiota, että saa luvan riittää. Myös tämä viestien sisällön puljaaminen edestakaisin (näkisittepä historian) on ihan sekopäistä, koeta joskus saada viestit valmiiksi.
Seuraavaksi voisit koodata juhannuksen jälkeiset laskurit (AUDIT, SADD, CIWA-Ar).
Metabolix kirjoitti:
Nyt on nähty Alkon katalogista jo niin monta versiota, että saa luvan riittää
Joo nyt saa riittää Alkon hinnaston virittelyt. Kaivelin täältä Putkasta vanhan VB.NET AviFile Wrapperin, joka jäi aikoinaan jotenkin unholaan. Rakentelin huvikseni sen pohjalta pienen testiviritelmän.
Projektit sorsineen löytyy täältä.
Pistetään nyt vielä sekaan pyörivät tiikerit
Aihe on jo aika vanha, joten et voi enää vastata siihen.