-
-
Save md2z34/4748871 to your computer and use it in GitHub Desktop.
| Option Explicit | |
| Sub OutputNotesXML() | |
| Dim iRow As Long | |
| Close #1 | |
| With ActiveSheet | |
| 'For iRow = 2 To 2 | |
| Open ThisWorkbook.Path & "\evernote-import.enex" For Output As #1 | |
| Print #1, "<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "?>" | |
| Print #1, "<!DOCTYPE en-export SYSTEM " & Chr(34) & "http://xml.evernote.com/pub/evernote-export.dtd" & Chr(34) & ">" | |
| Print #1, "<en-export export-date=" & Chr(34) & "20120202T073208Z" & Chr(34) & " application=" & Chr(34) & "Evernote/Windows" & Chr(34) & " version=" & Chr(34) & "4.x" & Chr(34) & ">" | |
| For iRow = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row | |
| Print #1, "<note><title>" | |
| Print #1, .Cells(iRow, "A").Value 'Title | |
| Print #1, "</title><content><![CDATA[<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "?>" | |
| Print #1, "<!DOCTYPE en-note SYSTEM " & Chr(34) & "http://xml.evernote.com/pub/enml2.dtd" & Chr(34) & ">" | |
| Print #1, "<en-note style=" & Chr(34) & "word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" & Chr(34) & ">" | |
| Print #1, CBr(.Cells(iRow, "B").Value) 'Note | |
| Print #1, "</en-note>]]></content><created>" | |
| Print #1, .Cells(iRow, "D").Text 'Created Date in Evernote Time Format... | |
| 'To get the evernote time, first convert your time to Zulu/UTC time. | |
| 'Put this formula in Column D: =C2+TIME(6,0,0) where 6 is the hours UTC is ahead of you. | |
| 'Then right click on your date column, select format, then select custom. Use this custom code: yyyymmddThhmmssZ | |
| Print #1, "</created><updated>201206025T000001Z</updated></note>" | |
| Next iRow | |
| Print #1, "</en-export>" | |
| Close #1 | |
| End With | |
| End Sub | |
| Function CBr(val) As String | |
| 'parse hard breaks into to HTML breaks | |
| CBr = Replace(val, Chr(13), "") | |
| CBr = Replace(CBr, "&", "&") | |
| End Function | |
| 'I modified this code from Marty Zigman's post here: http://blog.prolecto.com/2012/01/31/importing-excel-data-into-evernote-without-a-premium-account/ | |
| ' This will read ENEX file (Evernote export file) into Excel worksheet | |
| Sub ReadNotesXML() | |
| Dim fdgOpen As FileDialog | |
| Dim fp As Integer | |
| Dim i As Integer | |
| Dim DataLine As String, WholeFileContent As String | |
| Dim RE As Object, allMatches As Object | |
| Set RE = CreateObject("vbscript.regexp") | |
| Set fdgOpen = Application.FileDialog(msoFileDialogOpen) | |
| With fdgOpen | |
| .Filters.Add "Evernote files", "*.enex", 1 | |
| .TITLE = "Please open Evernote file..." | |
| .InitialFileName = "." | |
| .InitialView = msoFileDialogViewDetails | |
| .Show | |
| End With | |
| ' MsgBox fdgOpen.SelectedItems(1) | |
| fp = FreeFile() | |
| WholeFileContent = "" | |
| Open fdgOpen.SelectedItems(1) For Input As #fp | |
| WholeFileContent = Input$(LOF(fp), fp) | |
| Close #fp | |
| ' Removing CR&LF line endings | |
| WholeFileContent = Replace(WholeFileContent, Chr(10), "") | |
| WholeFileContent = Replace(WholeFileContent, Chr(13), "") | |
| ' Worksheets(1).Cells(5, 5) = WholeFileContent | |
| ' First line | |
| Worksheets(1).Cells(1, 1) = "Title" | |
| Worksheets(1).Cells(1, 2) = "Content" | |
| Worksheets(1).Cells(1, 3) = "Created" | |
| Worksheets(1).Cells(1, 4) = "Updated" | |
| ' Filter for title | |
| RE.Pattern = "<title>(.*?)<\/title>" | |
| RE.IgnoreCase = True | |
| RE.Global = True | |
| RE.MultiLine = True | |
| Set allMatches = RE.Execute(WholeFileContent) | |
| For i = 0 To allMatches.Count - 1 | |
| Worksheets(1).Cells(2 + i, 1) = allMatches(i).submatches(0) | |
| Next | |
| ' Filter for content | |
| RE.Pattern = "<content>(.*?)<\/content>" | |
| 'RE.IgnoreCase = True | |
| 'RE.Global = True | |
| Set allMatches = RE.Execute(WholeFileContent) | |
| For i = 0 To allMatches.Count - 1 | |
| Worksheets(1).Cells(2 + i, 2) = StripTags(allMatches(i).submatches(0)) | |
| Next | |
| ' Filter for created | |
| RE.Pattern = "<created>(.*?)<\/created>" | |
| 'RE.IgnoreCase = True | |
| 'RE.Global = True | |
| Set allMatches = RE.Execute(WholeFileContent) | |
| For i = 0 To allMatches.Count - 1 | |
| Worksheets(1).Cells(2 + i, 3) = allMatches(i).submatches(0) | |
| Next | |
| ' Filter for updated | |
| RE.Pattern = "<updated>(.*?)<\/updated>" | |
| 'RE.IgnoreCase = True | |
| 'RE.Global = True | |
| Set allMatches = RE.Execute(WholeFileContent) | |
| For i = 0 To allMatches.Count - 1 | |
| Worksheets(1).Cells(2 + i, 4) = allMatches(i).submatches(0) | |
| Next | |
| ' Free | |
| Set RE = Nothing | |
| Set allMatches = Nothing | |
| End Sub | |
| Function StripTags(inString As String) As String | |
| Dim RE As Object, allMatches As Object | |
| Set RE = CreateObject("vbscript.regexp") | |
| ' Keeping enters | |
| inString = Replace(inString, "</div>", " ") | |
| ' Removing other <tag>-s | |
| RE.Pattern = "<[^>]+>" | |
| RE.IgnoreCase = True | |
| RE.Global = True | |
| StripTags = RE.Replace(inString, "") | |
| ' Cleaning up strange things | |
| StripTags = Replace(StripTags, "]]>", "") | |
| StripTags = Replace(StripTags, "'", "'") | |
| StripTags = Replace(StripTags, " ", " ") | |
| ' Free | |
| Set RE = Nothing | |
| Set allMatches = Nothing | |
| End Function | |
| Sub r2i() | |
| Dim lLastRow As Long | |
| Dim lLastCol As Long | |
| Dim rgLast As Range | |
| Dim rgSrc As Range | |
| Dim rgDst As Range | |
| Dim i, j As Integer | |
| Dim RE As Object, allMatches As Object | |
| Set RE = CreateObject("vbscript.regexp") | |
| Dim m As String | |
| Set rgLast = Range("A1").SpecialCells(xlCellTypeLastCell) | |
| lLastRow = rgLast.Row | |
| lLastCol = rgLast.Column | |
| Set rgSrc = Range(Cells(2, 2), Cells(lLastRow, 2)) | |
| Set rgDst = Range(Cells(2, 1), Cells(lLastRow, 1)) | |
| RE.Pattern = "\((.*?)\)" | |
| RE.IgnoreCase = True | |
| RE.Global = True | |
| For i = 1 To rgSrc.Count | |
| ' Getting stuff in brackets | |
| Set allMatches = RE.Execute(rgSrc.Cells(i, 1)) | |
| m = "" | |
| If allMatches.Count > 0 Then | |
| For j = 0 To allMatches.Count - 1 | |
| If allMatches.Count = 1 Then | |
| m = allMatches(j).submatches(0) | |
| Else | |
| m = m & allMatches(j).submatches(0) & ";" | |
| End If | |
| Next | |
| rgDst.Cells(i, 1) = m | |
| Else | |
| m = rgDst.Cells(i, 1) | |
| rgDst.Cells(i, 1) = rgSrc.Cells(i, 1) | |
| rgSrc.Cells(i, 1) = m | |
| End If | |
| Next | |
| Set RE = Nothing | |
| Set allMatches = Nothing | |
| End Sub | |
| Sub i2r() | |
| Dim lLastRow As Long | |
| Dim lLastCol As Long | |
| Dim rgLast As Range | |
| Dim rgSrc As Range | |
| Dim rgDst As Range | |
| Dim i As Integer | |
| Dim RE As Object, allMatches As Object | |
| Set RE = CreateObject("vbscript.regexp") | |
| Dim m As String | |
| Set rgLast = Range("A1").SpecialCells(xlCellTypeLastCell) | |
| lLastRow = rgLast.Row | |
| lLastCol = rgLast.Column | |
| Set rgSrc = Range(Cells(2, 2), Cells(lLastRow, 2)) | |
| Set rgDst = Range(Cells(2, 1), Cells(lLastRow, 1)) | |
| RE.Pattern = "^(.*?)\s+\(.*" | |
| RE.IgnoreCase = True | |
| RE.Global = True | |
| For i = 1 To rgSrc.Count | |
| ' Getting stuff in brackets | |
| Set allMatches = RE.Execute(rgSrc.Cells(i, 1)) | |
| If allMatches.Count > 0 Then | |
| rgDst.Cells(i, 1) = allMatches(0).submatches(0) | |
| Else | |
| m = rgDst.Cells(i, 1) | |
| rgDst.Cells(i, 1) = rgSrc.Cells(i, 1) | |
| rgSrc.Cells(i, 1) = m | |
| End If | |
| Next | |
| Set RE = Nothing | |
| Set allMatches = Nothing | |
| End Sub | |
To pull the tags out, try adding these lines between lines 107 and 108 above. I'm no coder, so it's probably a bit hacky but it seems to work OK: Might be a bit slow if you have a lot of notes - it parses the whole thing.
' Filter for tags
Dim j As Integer
Dim FoundTagStart As Integer
Dim NewTagSameNote As Integer
Dim WholeFileLength As Integer
Dim StringPosn As Integer
Dim Tag As String
i = 0
j = 0
StringPosn = 0
WholeFileLength = Len(WholeFileContent)
IncrStringPosn:
StringPosn = StringPosn + 1
If StringPosn > WholeFileLength Then
GoTo EndTagSearch
End If
If NewTagSameNote = 0 Then
j = 0
End If
If (Mid(WholeFileContent, StringPosn, 5) = "<tag>") Then
FoundTagStart = 1
StringPosn = StringPosn + 4
GoTo IncrStringPosn
End If
If (FoundTagStart = 1) And (Mid(WholeFileContent, StringPosn, 6) <> "</tag>") Then
Tag = Tag + Mid(WholeFileContent, StringPosn, 1)
GoTo IncrStringPosn
End If
If (FoundTagStart = 1) And (Mid(WholeFileContent, StringPosn, 11) = "</tag><tag>") Then
NewTagSameNote = 1
Worksheets(1).Cells(2 + i, 5 + j) = StripTags(Tag)
Tag = ""
j = j + 1
StringPosn = StringPosn + 10
GoTo IncrStringPosn
End If
If (FoundTagStart = 1) And (Mid(WholeFileContent, StringPosn, 6) = "</tag>") Then
NewTagSameNote = 0
Worksheets(1).Cells(2 + i, 5 + j) = StripTags(Tag)
Tag = ""
i = i + 1
FoundTagStart = 0
GoTo IncrStringPosn
End If
GoTo IncrStringPosn
EndTagSearch:
p.s. the 'StripTags' function accounts for some of the markup used in the .enex file rather than 'Tags' in the Evernote sense of the word :)
OK, found a problem - doesn't work if there are pictures in the Evernotes :( It trips on the 'len' statement - not sure of I've reached an absolute limit of if I can declare may variable differently to get round it...?
Hey great code, I have used the code which pulls information from Evernote into Excel which works a treat, but I'd like it to also pull the location and author in from Evernote too. How can I get it to do this?
I'd be interested in retaining a list of tags, such as a single cell with delimited entries, or as multiple cells. Would simply removing the "StripTags" function achieve this? What is the purpose of stripping out the tags?