I'd use two Array Modifiers, a Subsurf and a Boolean to achieve the result. Check out the Blend file here for the result:
Start off with a plane and create this pattern here:
Step by step manual to do that:
I created it using a plane, went into edit mode, and subdivided it once. Then i selected the center vertex and hit Ctrl + Shift + B to bevel the vertex interactively. While still beveling, also press Ctrl + to add a segment to the result. That should give you this:
Now you can switch to face selection mode, and use LoopTools to create a circle inside:
delete the inner faces and scale the circle to your liking.
Notice that I spent a lot of attention making sure that the vertices are evenly spaced, also on the outside!
Now to the modifiers: Add an Array modifier, set the number to 30 or so, and use relative offset of 1 to generate the first row. Check the Merge Option, it will be needed for the Boolean to work!
The second array is more tricky. You need to use constant offset as well as relative offset. The relative one duplicates the row of holes in the second direction, the constant one shifts them to the side by half the width of your base mesh. Notice that depending on your scene this value can differ from mine quite a bit! Again, check the Merge option.
Now create a cylinder that encompasses what you have so far:
Lastly, add a subsurf (to smooth the holes) and the boolean, to cut the result. Choose the cylinder as the cutting object:
One thing to note: I was using the latest Development Build of Blender for this, that's why I have the 'BMesh' option visible. If you don't have it, the Boolean might not work reliably enough, and you need to tweak the final mesh a bit by applying all modifiers and deleting some faces. For me it looked like this in 'old' Blender: